2014-07-10 83 views
0

團隊,列使用Lucene.NET搜索時優先

我有6個索引列來搜索如下。

  1. 名稱
  2. 說明
  3. SKU
  4. 類別
  5. 價格
  6. SearchCriteria

現在,在尋找我需要在"SearchCritera"列執行搜索第一,然後休息列。

總之 - 與匹配的產品「SearchCritera」 shold顯示在搜索結果的頂部。

var parser = new MultiFieldQueryParser(Version.LUCENE_30, 
    new[] { "SearchCriteria", 
     "Name", 
     "Description", 
     "SKU", 
     "Category", 
     "Price" 
    }, analyzer); 
var query = parseQuery(searchQuery, parser); 

var finalQuery = new BooleanQuery(); 
finalQuery.Add(parser.Parse(searchQuery), Occur.SHOULD); 

var hits = searcher.Search(finalQuery, null, hits_limit, Sort.RELEVANCE); 

回答

5

有兩種方法可以做到這一點。

第一種方法是利用場增壓:

索引設置一個推動通過他們的優先領域:

 Field name = new Field("Name", strName, Field.Store.NO, Field.Index.ANALYZED); 
     name.Boost = 1; 

     Field searchCriteria = new Field("SearchCriteria", strSearchCriteria, Field.Store.NO, Field.Index.ANALYZED); 
     searchCriteria.Boost = 2; 

     doc.Add(name); 
     doc.Add(searchCriteria); 

這樣在SearchCriteria領域方面的得分將增加一倍然後在名稱字段中對條款進行評分。

如果您始終希望SearchCriteria比Name更重要,則此方法更好。

第二種方法是使用MultiFieldQueryParser期間搜索增壓:

Dictionary<string,float> boosts = new Dictionary<string,float>(); 
     boosts.Add("SearchCriteria",2); 
     boosts.Add("Name",1); 

     MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30new[], new[] { "SearchCriteria", "Name"}, analyzer, boosts); 

這種方法是更好,如果你想升壓只有在應用程序中的某些情況下工作。

您應該嘗試查看助推號碼是否符合您的需求(您正在尋找的優先級的敏感度)並根據您的需求進行更改。

爲了使示例簡短易讀我只是你的域2使用,但你應該使用所有這些詛咒...

+1

非常感謝答覆。我會在測試後回覆你:) – dLcreations