[英]Best approach find position of an item in Lucene search results
我正在使用Lucene.NET,并且能够以ScoreDoc []的形式搜索匹配结果。
我需要知道ScoreDoc []中特定项目的位置。 ScoreDoc []中的所有项目都是唯一的。
示例代码:luceneSearcher.Search(query,collector); ScoreDoc []分数= collector.TopDocs()。scoreDocs
例如,我需要在ScoreDoc []中查找项目位置,该位置具有自定义ID属性,其值可以为“ 99999”。
我可以遍历scores []中的项目并检查与“ 99999”匹配的ID属性,然后返回该位置,但这会导致性能下降,因为scores []可以包含数千个项目。
有更好的技术吗?
谢谢
我想出了一个新的ExtendedCollector,用于存储CollectedDocuments。
public class ExtendedCollector : Collector
{
private Scorer _scorer;
private Int32 _docBase;
private List<CollectedDocument> _documents;
public ExtendedCollector()
{
_documents = new List<CollectedDocument>();
}
public override void SetScorer(Scorer scorer)
{
_scorer = scorer;
}
public override void Collect(int doc)
{
var docId = _docBase + doc;
var score = _scorer.Score();
var currentDoc = _documents.FirstOrDefault(d => d.DocId == docId);
if (currentDoc == null)
_documents.Add(new CollectedDocument()
{DocId = docId, Score = score, OriginalIndex = _documents.Count, Index = _documents.Count});
else
currentDoc.Score = score;
}
public override void SetNextReader(IndexReader reader, int docBase)
{
_docBase = docBase;
}
public override bool AcceptsDocsOutOfOrder()
{
return false;
}
public List<CollectedDocument> Documents
{
get { return _documents; }
}
public List<CollectedDocument> DocumentsByScore
{
get
{
var result = _documents.OrderByDescending(d => d.Score).ToList();
var itemId = 0;
foreach (var collectedDocument in result)
{
itemId++;
collectedDocument.Index = itemId;
}
return result;
}
}
}
CollectedDocument看起来像这样
public class CollectedDocument
{
public Int32 DocId { get; set; }
public float Score { get; set; }
public int OriginalIndex { get; set; }
public int Index { get; set; }
}
每当您想要获得结果时,您都会做
var myCollector = new ExtendedCollector();
searcher.Search(searchQuery, myCollector);
foreach (var doc in myCollector.Documents)
{
var docIndex = doc.Index; //this is the current index in a list
var originalIndex = doc.OriginalIndex; //this is item Id set when doc was collected
}
您还可以使用分数获得按分数排序的文档
myCollector.DocumentsByScore
这可能不是最简单的解决方案,但它可以工作。 如果有人有更好的解决方案,请将其发布,因为我也想知道这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.