【发布时间】:2013-11-27 23:59:57
【问题描述】:
我正在尝试构建一个通过 Lucene 索引实现搜索系统的应用程序。现在索引已建立,我可以在索引上搜索文档,一切似乎都工作正常,但是当我使用许多文档中使用的字段进行搜索时,分析器只返回一些文档。我尝试使用 Luke 进行相同的搜索并且行为方式相同。
即:我的索引有 2 个字段:
字段 A:唯一的标识符。 字段 B:一个字符串。
第一个例子:
我们有 5 个文件:
文档 1:字段 A:1;字段B:你好世界
文档 2:字段 A:2; FieldB:世界你好!
文档 3:字段A:3;字段B:你好世界
文件 4:FieldA:4;字段B:任何东西
文档 5:字段A:5;字段B:你好世界
当我进行像“B: hello world”这样的搜索时,它应该返回文档 1、3 和 5,但它只返回 1 和 3。
当我进行像“A: 5”这样的搜索时,它会返回文档 5,字段 B 的值是“hello world”。
第二个例子:(一个令牌)
文档 6:字段 A:6;字段B:令牌
文档 7:字段A:7;字段B:令牌
文档 8:字段A:8;字段B:TOKEN
文档 9:FieldA:9 FieldB:token
当我搜索 FieldB:"token" 时,它只返回 Doc 6 和 Doc 9。我能找到 Doc 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) {
...
}
}
我注意到未返回的文档的分值较低。假设在创建索引时这是一个问题,因为 Luke 的行为方式与应用程序相同,那么我做错了什么?
提前致谢!
【问题讨论】:
-
我在您的示例中看不到任何会导致此类问题的内容。我也不明白您如何为查询中未找到的文档评分。也许更多信息会很有用,例如您的搜索代码,以及有关实际发生此问题的数据的更多信息?
-
感谢@femtoRgon!该示例是解释正在发生的事情的最简单方法。真正的索引有超过 12 个字段,并且比示例复杂得多。正如我在第一篇文章中所说,即使字段满足搜索请求,Luke 也不会显示文档。所以,问题应该出在索引生成过程上。我将添加有关索引生成的更多信息。
-
您在哪里看到“未返回的文档具有低分值”?
-
我有 2 个字段具有相同的值,第一个字段没有分析,我有问题,第二个字段有标记,分析后可以正常工作。我尝试在第一个字段中搜索“hello world”并得到 2 个结果,第二个字段中的相同搜索返回 3 个字段(按照示例)。当我尝试仅使用一个标记搜索字符串时也会发生同样的情况,因此问题与标记无关。当我按第二个字段搜索时,我得到第一个字段搜索未返回的文档,即使字段值相同,所有这些文档的分值都非常低。