我想建立一个应用程序,实现了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