对Java Lucene忽略字段进行故障排除

对Java Lucene忽略字段进行故障排除

Troubleshoot Java Lucene ignoring Field

我们目前正在使用Lucene 2.1.0进行站点搜索,但是遇到了一个难题:在目标搜索过程中,我们的索引字段之一被忽略了。 这是将字段添加到索引中的文档的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Add market_local to index
contactDocument.add(
    new Field(
       "market_local"
        , StringUtils.objectToString(
            currClip.get(
               "market_local"
            )
        )
        , Field.Store.YES
        , Field.Index.UN_TOKENIZED
    )
);

对索引运行查询(*)将返回以下结果:

1
2
3
4
5
6
7
Result 1:
    title: Foo Bar
    market_local: Local

Result 2:
    title: Bar Foo
    market_local: National

运行目标查询:

1
+( market_local:Local )

找不到任何结果。

我意识到这是一个非常具体的问题,因为我是Lucene新手,所以我只是想获取有关从哪里开始调试此问题的信息。

更新

已安装Luke,签出最新索引...可以在搜索中找到field market_local,因此如果执行以下操作:

1
market_local:Local

搜索正常(在Luke中)。 我现在要检查分析器代码,有什么办法可以解决这个问题,以至于我们的搜索应用程序使用的是Lucene 2.1.0,而最新版本的Luke使用的是2.3.0?


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


"为什么我没有获得成功?"部分Lucene FAQ中的一些建议可能会有用。您使用的是Field.Index.UN_TOKENIZED,因此不会将任何分析器用于索引(我认为)。如果在搜索时使用分析器,则可能是问题的根源-索引和搜索分析器应该相同,以确保获得正确的结果。


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


另一个简单的操作是使用调试器或日志记录语句来检查

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

确保它是您所想的。


推荐阅读