RavenDB查询建议多个单词

时间:2012-06-07 15:34:52

标签: ravendb

我有一些代码正在使用以下索引搜索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可以实现吗?

2 个答案:

答案 0 :(得分: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) + ")";
}

答案 1 :(得分:0)

ilivewithian,

我们根据我们使用的条款构建建议。 您可以将查询字段索引两次,一次使用Analyzed(在这种情况下将其分解为单词),一次使用默认值,在这种情况下,它使用完整的术语。 这可能会给你你想要的东西。