对Java Lucene忽略字段进行故障排除
我们目前正在使用Lucene 2.1.0进行站点搜索,但遇到了一个难题:在目标搜索过程中,索引字段之一被忽略。这是将字段添加到索引中的文档的代码:
// Add market_local to index contactDocument.add( new Field( "market_local" , StringUtils.objectToString( currClip.get( "market_local" ) ) , Field.Store.YES , Field.Index.UN_TOKENIZED ) );
对索引运行查询(*)将返回以下结果:
Result 1: title: Foo Bar market_local: Local Result 2: title: Bar Foo market_local: National
运行目标查询:
+( market_local:Local )
找不到任何结果。
我意识到这是一个非常具体的问题,因为我是Lucene新手,所以我只是想获取有关从哪里开始调试此问题的信息。
更新
已安装Luke,请检查最新索引...可以在搜索中找到field market_local,因此如果执行以下操作:
market_local:Local
搜索正常(在Luke中)。我现在要检查分析器代码,有什么办法可以解决这个问题,因为我们的搜索应用程序使用的是Lucene 2.1.0,而最新版本的Luke使用的是2.3.0?
解决方案
回答
对于调试Lucene,最好的工具是Luke,它使我们可以在索引本身中四处查看以查看被索引的内容,进行搜索等。我建议下载它,将其指向索引,然后查看其中的内容。
回答
"为什么我没有获得成功?"部分在Lucene FAQ中有一些建议可能会有用。我们正在使用Field.Index.UN_TOKENIZED,因此不会使用任何分析器进行索引(我认为)。如果在搜索时使用分析器,那么这可能是问题的根源,索引和搜索分析器应该相同,以确保获得正确的结果。
回答
另一个简单的事情是使用调试器或者日志记录语句来检查
StringUtils.objectToString(currClip.get("market_local"))
确保它是我们所想的。
回答
Luke与Lucene捆绑在一起,但是我们可以告诉Luke使用另一个版本的Lucene。说" lucene-core-2.1.0.jar"包含要使用的Lucene 2.1.0," luke.jar"包含Luke和Lucene 2.3.0。然后,我们可以使用以下命令启动Luke。
java -classpath lucene-core-2.1.0.jar;luke.jar org.getopt.luke.Luke
(技巧是将Lucene版本放在Luke之前的类路径上。而且,这在Windows上。在Unix上,将";"替换为":"。)
我们可以在卢克办理登机手续,
+( market_local:Local )
被重写为
market_local:Local
如果调用了Query对象的rewrite(IndexReader)方法。这两个查询应该等效,因此2.1中可能存在错误。如果必须使用2.1,则可以尝试在将Query对象传递给IndexSearcher之前手动调用该方法。