Используя Lucene, я делаю некоторую оценку на довольно классических тестовых коллекциях, содержащих документы, запросы и файлы релевантности (qrels). Qrels сообщают нам, какие документы должны быть возвращены lucene как относящиеся к конкретному запросу, поэтому качество поиска lucenes можно измерить (с некоторыми параметрами, но это не важно прямо сейчас).Внешний документ Lucene Id отклоняется от внутреннего индекса docId
Моя проблема заключается в том, что документы в коллекциях тестов (то есть коллекция TIME) имеют свои собственные идентификаторы документов - однако они могут иметь пробелы (например: коллекция TIME содержит 423 документа, но начинается с идентификатора документа 17 и заканчивается с ID 563). Идентификатор документа индексируется и сохраняется как IntField.
document.add(new IntField(Constants.INDEX_ID_FIELD, testDocument.getId(),Field.Store.YES));
Однако, я могу (может быть, даже должен) не использовать IndexReader.getTermVectors() метод, чтобы получить доступ к документам их внешних идентификаторы, так как внутренние DocId, используемый Lucene внутри этого метода не соответствуют внешнему идентификатору (из-за пробелов). Я получаю сообщение об ошибке «docID должно быть> = 0 и < maxDoc = 423 (получено docID = 520)».
Каким будет предпочтительный способ заставить lucene правильно обращаться к Документу 520, чтобы вызвать метод getTermVectors для документа через внутренний docId? я пытался получить нужный документ так:
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
Однако документ, кажется, не найти (но это в индексе - проверяется с помощью Луки). Я всегда получаю:
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 нормальное поле, но, может быть, я полностью на ложном пути здесь? Любая помощь будет оценена по достоинству.
Большое спасибо! Jan
Спасибо большое - получилось! Я попробовал подход IntField с помощью NumericRangeQuery, и он отлично работает! Я также попробую с StringField позже. – JanJanJan