队
我有6个索引列要搜索如下。
现在,在搜索时我需要首先在"SearchCritera"
列上执行搜索,然后是其余列。
简而言之 - 匹配“SearchCritera”的产品会显示在搜索结果的顶部。
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);
答案 0 :(得分:7)
有两种方法可以做到。
第一种方法是使用字段提升:
在索引期间,按优先级设置字段的提升:
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个字段,但你应该使用所有字段...