簡體   English   中英

Lucene外部文檔ID偏離內部索引docId

[英]Lucene external document Id deviating from internal index docId

使用Lucene,我對包含文檔,查詢和相關文件(qrels)的相當經典的Testcollections進行了一些評估。 qrel告訴我們與特定查詢相關的Lucene應該返回哪些文檔,因此可以測量Lucenes的搜索質量(使用一些參數,但這並不重要)。

我的問題是:測試集合(即TIME集合)中的文檔具有其自己的文檔ID-但是,它們之間可能會有間隙(例如:TIME集合包含423個文檔,但以文檔ID 17開頭,以ID 563結尾) 。 文檔ID被索引並存儲為IntField。

document.add(new IntField(Constants.INDEX_ID_FIELD, testDocument.getId(),Field.Store.YES));

但是,我不能(甚至不應該)使用IndexReader.getTermVectors()方法通過外部ID訪問文檔,因為Lucene在該方法內部使用的內部docId與外部ID不匹配(因為存在間隙)。 我收到一條錯誤消息:“ docID必須> = 0且<maxDoc = 423(got docID = 520)”。

使Lucene正確訪問文檔520以通過內部docId調用文檔的getTermVectors方法的首選方法是什么? 我試圖通過這種方式獲取正確的文檔:

IndexSearcher searcher = myTestRunner.indexSearcher;
TermQuery query = new TermQuery(new Term(Constants.INDEX_ID_FIELD, String.valueOf(docIdx)));
TopDocs topdocs = searcher.search(query, 1);
ScoreDoc[] treffer = topdocs.scoreDocs;
int docId = treffer[0].doc;
Terms vector = myTestRunner.indexReader.getTermVector(docId, "content");
// ... some more code follows

但是,似乎沒有找到該文檔(但在索引中-使用Luke檢查)。 我總是得到:

2015-03-19 12:23:25 ERROR ControlView:1002 - 0 java.lang.ArrayIndexOutOfBoundsException: 0
at de.janjan.irtool.querygenerator.QueryGenerator.getFrequencies(QueryGenerator.java:335)

我的下一個想法是將IntField設為普通字段,但也許我在這里完全走錯了軌道? 任何幫助將不勝感激。

在此先多謝! 一月

關於Lucene的內部DocID(即,在ScoreDoc.doc看到的),您不應將其用作外部ID。 它們可以更改而不會發出警告(特別是如果您曾經更新過文檔)。

數字字段(例如IntField)不會被索引為純文本,而是被編碼為一種使在數字范圍上進行搜索有效的形式。 要搜索它們,您應該使用NumericRangeQuery ,例如:

Query query = NumericRangeQuery.newIntRange(Constants.INDEX_ID_FIELD, docIdx, docIdx, true, true);

但是,如果這是典型的id字段,則不會使用IntField 為了方便起見,大多數這樣的時間標識符都是由數字組成的,而不是因為它們代表有意義的數字。 通常,如果在數字范圍內搜索該字段沒有意義,則最好使用StringField代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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