我们目前使用 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 之前手动调用该方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top