3

次のインデックスで RavenDB データベースを検索するコードがあります。

public class Products_Search :
                AbstractIndexCreationTask<Product, Products_Search.Result>
{
    public class Result
    {
        public string Query { get; set; }
    }

    public Products_Search()
    {
        Map = products =>
              from product in products
              select new
              {
                  Query = new
                  {
                      Categories = product.Categories.Boost(5),
                      Brands = product.Brands.Boost(8),
                      product.Description,
                      Name = product.Name.Boost(10),
                      product.SKU
                  },
                  product.Price
              };

        Index(x => x.Query, FieldIndexing.Analyzed);
    }
}

これに対して次のようにクエリすると (両方のストロベリー プロテインのスペルが間違っています):

var query = RavenSession.Query<Products_Search.Result, Products_Search>()
                        .Where(x => x.Query == "strawbery protien");

var suggestions = query.Suggest().Suggestions.Take(5)

「いちご」と「プロテイン」ではなく、「いちごプロテイン」を提案してほしい。これは RavenDB で可能ですか?

4

2 に答える 2

1

私は似たようなことをしなければならず、LuceneQueryそれを達成するために構文を使用します。私は演算子を使用してORいますが、演算子を使用したいと思うでしょうAND

インデックス

public class ContentItem_BySearchParam : AbstractIndexCreationTask<ContentItem>
{
    public ContentItem_BySearchParam()
    {
        Map = contentItems =>
                from contentItem in contentItems
                select new {contentItem.Title, contentItem.Description, contentItem.Keywords};

        Store("Title", FieldStorage.Yes);
        Index("Title", FieldIndexing.Analyzed);

        Store("Description", FieldStorage.Yes);
        Index("Description", FieldIndexing.Analyzed);

        Store("Keywords", FieldStorage.Yes);
        Index("Keywords", FieldIndexing.Analyzed);
    }
}

クエリ

public SearchResults GetResults(IDocumentSession db, params string[] searchTerms)
{
    var query =
            GetLuceneQuery("Title", searchTerms) + " OR " +
            GetLuceneQuery("Description", searchTerms) + " OR " +
            GetLuceneQuery("Keywords", searchTerms);

    var results = db
        .Advanced
        .LuceneQuery<ContentItem, RavenIndexes.ContentItem_BySearchParam>()
        .Where(query)
        .ToList();

      .... do other stuff
}

private string GetLuceneQuery(string field, string[] terms, string searchOperator = "")
{
    var join = " " + searchOperator;
    var prefix = field + ":(" + searchOperator;
    return prefix + String.Join(@join, terms) + ")";
}
于 2012-06-08T16:41:00.883 に答える
0

イライブウィティアン、

使用する用語に基づいて提案を作成します。1 回は Analyzed を使用して (この場合は単語に分割します)、もう 1 回は default を使用して完全な用語を使用します。それはあなたが望むものを与えるかもしれません。

于 2012-06-09T07:53:23.040 に答える