2012-06-07 98 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字段編入索引,在這種情況下,它將使用全部術語。 這可能會給你你想要的。