对Java Lucene忽略Field进行故障排除

时间:2008-09-03 20:59:10

标签: java lucene

我们目前正在使用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 在搜索中可用,因此如果执行类似的操作:

market_local:Local

搜索工作正常(在Luke中)。我现在正在查看我们的Analyzer代码,有没有什么方法可以解决这个问题,因为我们的搜索应用程序使用的是Lucene 2.1.0而最新版本的Luke使用的是2.3.0?

4 个答案:

答案 0 :(得分:6)

对于调试Lucene,最好的工具是Luke,它允许你在索引本身中查看索引的内容,执行搜索等。我建议下载它,指向你的索引,看看那里有什么。

答案 1 :(得分:2)

Lucene常见问题解答中的section on "Why am I getting no hits?"提供了一些您可能会觉得有用的建议。您正在使用Field.Index.UN_TOKENIZED,因此没有分析器将用于索引(我认为)。如果您在搜索时使用的是分析器,那么这可能是您问题的根源 - 索引和搜索分析器应该是相同的,以确保您获得正确的命中。

答案 2 :(得分:1)

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

的值
  

StringUtils.objectToString(currClip.get( “market_local”))

确保它符合你的想法。

答案 3 :(得分:1)

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:本地

如果调用the rewrite(IndexReader) method of the Query object。这两个查询应该是等效的,因此2.1中可能存在错误。如果必须使用2.1,则可以在将Query对象传递给IndexSearcher之前尝试手动调用该方法。