2012-06-07 67 views
3

我有一些代码,与下面的目录检索一个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?

回答

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) + ")"; 
} 
0

ilivewithian,

我们建立基于我们使用的条款的建议。 您可以使用Analyzed(在这种情况下会将其分解为单词)并使用默认值一次将Query字段编入索引,在这种情况下,它将使用全部术语。 这可能会给你你想要的。