我想要的是:
在搜索方法中,我将添加一个额外的参数,表示float类型的相关参数,以设置cuttoff相关性。因此,假设截止值为60%,我希望项目的相关性高于60%。
以下是当前的搜索代码:
说搜索文本是 在lucene文件系统中我有以下描述: 1)abcdef 2)ABC 3)ABCD
目前它将获取以上所有三个文档,我想获取那些高于60%相关性的文档。
//现在我没有在方法中的任何地方使用correlationparam:
public static string[] Search(string searchText,float relevanceparam)
{
//List of ID
List<string> searchResultID = new List<string>();
IndexSearcher searcher = new IndexSearcher(reader);
Term searchTerm = new Term("Text", searchText);
Query query = new TermQuery(searchTerm);
Hits hits = searcher.Search(query);
for (int i = 0; i < hits.Length(); i++)
{
float r = hits.Score(i);
Document doc = hits.Doc(i);
searchResultID.Add(doc.Get("ID"));
}
return searchResultID.ToArray();
}
修改:
如果我为我的查询设置了提升,该怎么办? 说:query.SetBoost(1.6); - 这相当于60%?
答案 0 :(得分:0)
您可以通过忽略小于TopDocs.MaxScore * minRelativeRelevance
的匹配来轻松完成此操作,其中minRelativeRelevance
应该是介于0和1之间的值。
我修改了您的代码以匹配Lucene.Net的3.0.3版本,并在调用IndexSearcher.Doc
时添加了一个FieldSelector,以避免加载非必填字段。
调用Query.SetBoost(1.6)
只会意味着该查询计算得分将提高60%(乘以1.6)。如果涉及其他查询(例如,在BooleanQuery中),它可能会更改结果的顺序,但它不会更改返回的结果。
public static String[] Search(IndexReader reader, String searchText,
Single minRelativeRelevance) {
var resultIds = new List<String>();
var searcher = new IndexSearcher(reader);
var searchTerm = new Term("Text", searchText);
var query = new TermQuery(searchTerm);
var hits = searcher.Search(query, 100);
var minScore = hits.MaxScore * minRelativeRelevance;
var fieldSelector = new MapFieldSelector("ID");
foreach (var hit in hits.ScoreDocs) {
if (hit.Score >= minScore) {
var document = searcher.Doc(hit.Doc, fieldSelector);
var hitId = document.Get("ID");
resultIds.Add(hitId);
}
}
return resultIds.ToArray();
}