簡體   English   中英

最佳方法在Lucene搜索結果中找到項目的位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM