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

时间:2020-03-05 18:47:18  来源:igfitidea点击:

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