题
我们目前使用 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,正在查看最新索引...场 本地市场 在搜索中可用,所以如果我执行如下操作:
market_local:Local
搜索工作正常(在路加福音中)。我现在正在检查我们的分析器代码,有什么方法可以将此问题归因于我们的搜索应用程序使用 Lucene 2.1.0 而最新版本的 Luke 使用 2.3.0?
解决方案
对于调试 Lucene,最好使用的工具是 卢克, ,它可以让您浏览索引本身以查看索引的内容、执行搜索等。我建议下载它,将其指向您的索引,然后查看其中的内容。
其他提示
这 “为什么我没有得到点击?”部分 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:本地 )
被重写为
market_local:本地
如果 Query 对象的 rewrite(IndexReader) 方法 叫做。这两个查询应该是等效的,因此 2.1 中可能存在错误。如果必须使用 2.1,则可以尝试在将 Query 对象传递给 IndexSearcher 之前手动调用该方法。