我想建立一個應用程序,實現了Lucene索引的搜索系統。現在索引已經建好了,我可以在索引上搜索文檔,並且一切似乎都正常,但是當我使用許多文檔中使用的字段進行搜索時,分析器只返回一些文檔。我試圖使用盧克進行相同的搜索,並採用相同的方式。Lucene的搜索跳過一些結果
例如:我的索引有2個字段:
字段A:唯一的標識符。 字段B:一個字符串。
第一示例:
我們有5個文件:
文件1:FIELDA:1; FieldB:hello world
Doc 2:FieldA:2; FieldB:你好,世界!
Doc 3:FieldA:3; FieldB:hello world
Doc 4:FieldA:4; FieldB:任何東西
Doc 5:FieldA:5; FieldB:世界你好
當我作出這樣一個搜索「B:Hello World」的應該返回文件1,3和5,但它只返回1和3
當我作出這樣一個搜索「A:5」返回文檔5,字段B的值爲「hello world」。
第二實例:(一個令牌)
文件6:FIELDA:6; FieldB:token
Doc 7:FieldA:7; FieldB:token
Doc 8:FieldA:8; FieldB:TOKEN
文件9:FIELDA:9 FieldB:令牌
當我搜索FieldB: 「令牌」 它只返回文檔6和Doc 9.我能找到文件的唯一方法是7通過其FieldA進行搜索。
我使用的是WhitespaceAnalyzer,並且這兩個字段都是NOT_ANALYZED。
IndexGenerator主要
...
IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);;
writer.setRAMBufferSizeMB(200);
List<Work> works = getWorks(); //Retrieves the information from the DB
for (Work work: works) {
Document luceneDocument = createLuceneDocument(work);
writer.addDocument(luceneDocument);
}
writer.commit();
...
CreateLuceneDocument方法:
private static Document createLuceneDocument(Work work) {
try {
Document luceneDoc = new Document();
...
Field id = new Field("ID", work.getId(),Field.Store.YES,Field.Index.NOT_ANALYZED);
luceneDoc.add(id);
Field name = new Field("NAME", work.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
luceneDoc.add(name);
...
return document;
}
catch (LuceneException e) {
...
}
}
我注意到,未返回的文檔具有低分值。假設這是索引創建時的問題,因爲盧克的行爲與應用程序的行爲相同,我在做什麼錯了?
提前致謝!
我沒有看到你的例子中會出現這樣的問題。我也不明白你怎麼能得到一個文件的分數,而你的查詢沒有找到。也許一些更多的信息是有用的,比如你的搜索代碼,以及關於這個問題實際發生的數據的一些進一步的信息? – femtoRgon
謝謝@femtoRgon!這個例子是解釋發生的最簡單的方法。真實指數超過12個字段,比例子更復雜。 正如我在第一篇文章中所說,即使這些字段滿足搜索請求,Luke也不會顯示這些文檔。所以,問題應該在索引生成過程中。 我將添加更多關於索引生成的信息。 – user2993510
你在哪裏看到「未返回的文檔具有低分值」? – groverboy