2011-06-23 69 views
3

我试图搜索几个字段,它工作正常,除非我使用术语“是”。在这种情况下,lucene只会忽略该字段。如果我做了如下所示的操作,我会得到正确的结果,“查询”对象显示为“+ flag:bf + type:cgo”。如果我将标志或类型术语中的任何一个设置为“是”,那么搜索的一部分将被忽略。 例如,如果我将queryString设置为“flag:\”BE \“并键入:\”CGO \“”查询对象将显示为:“+ type:cgo”,我会得到更多的点击。 “类型”也是如此 - 如果我在最后一个例子中将“CGO”更改为“BE”,它将被忽略。我没有尝试过所有可能的2个字符组合(但我已经尝试了很多),但除了这一个以外,其他所有功能都按预期工作我没有使用任何停止条款。Lucene QueryParser忽略搜索项“BE”

感谢, 基因

String queryString = "flag:\"BF\" AND type:\"CGO\""; 
QueryParser qp = new QueryParser(Version.LUCENE_30, 
        "type", new StandardAnalyzer(Version.LUCENE_30)); 

Query query = qp.parse(queryString); 
IndexSearcher searcher = new IndexSearcher(reader.reopen()); 
TopDocs td = searcher.search(q, 5000); 
logger.info("Found " + td.totalHits + " hits using " + query.toString()); 

回答

4

默认情况下,StandardAnalyzer使用一组停用词从文本中的索引术语中排除“噪音”。在StandardAnalyzer中,我认为“BE”通常被认为是一个停用词。

幸运的是,你必须提供给您

最明显的一个是空集的停止词传递给StandardAnalyzer使用的构造几个选择。

但是,查看字段名称(“标志”和“类型”),它们看起来并不像看起来像是包含简单的文本,而更可能包含编码的单词。考虑到这一点,您可能会发现关键字分析器更合适。

祝你好运,

+0

谢谢。使用关键字分析器而不是标准分析器解决了这个问题。 –

1

你确实使用停用词,虽然你可能不会想:

QueryParser qp = new QueryParser(Version.LUCENE_30, 
       "type", new StandardAnalyzer(Version.LUCENE_30)); 

StandardAnalyzer使用标准英语禁用词在默认情况下,它包括“是” 。

+0

是的你是对的。我没有意识到标准分析仪在创建时使用的是停用词。通过使用关键字分析器来修复它。谢谢。 –