2

我们目前正在使用 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 新手。


更新

安装卢克,检查最新索引...字段market_local在搜索中可用,所以如果我执行类似的操作:

market_local:Local

搜索工作正常(在卢克)。我现在正在检查我们的分析器代码,有什么办法可以将这个问题归结为我们的搜索应用程序使用的是 Lucene 2.1.0 而最新版本的 Luke 使用的是 2.3.0 的事实?

4

4 回答 4

6

对于调试 Lucene,最好使用的工具是Luke,它可以让您在索引本身中四处寻找索引,执行搜索等。我建议下载它,将其指向您的索引,然后查看其中的内容。

于 2008-09-03T22:17:54.020 回答
2

关于“为什么我没有得到点击”的部分 在 Lucene FAQ 中有一些您可能会觉得有用的建议。您正在使用 Field.Index.UN_TOKENIZED,因此不会使用分析器进行索引(我认为)。如果您在搜索时使用分析器,那么这可能是问题的根源 - 索引和搜索分析器应该相同,以确保您获得正确的命中。

于 2008-09-04T11:36:45.847 回答
1

另一个简单的事情是使用调试器或日志语句来检查

StringUtils.objectToString(currClip.get("market_local"))

确保它是你认为的那样。

于 2008-09-04T11:44:48.027 回答
1

Luke 与 Lucene 捆绑在一起,但您可以告诉 Luke 使用另一个版本的 Lucene。假设“lucene-core-2.1.0.jar”包含您要使用的 Lucene 2.1.0,“luke.jar”包含带有 Lucene 2.3.0 的 Luke。然后您可以使用以下命令启动 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 之前手动调用该方法。

于 2008-09-29T22:08:14.257 回答