Lucene QueryParser忽略搜索词“BE”

时间:2011-06-23 18:03:57

标签: search lucene

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

谢谢, 基因

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() );

2 个答案:

答案 0 :(得分:4)

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

幸运的是,你有几个选择

显而易见的一种方法是将一组空的停用词传递给所使用的StandardAnalyzer的构造函数。

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

祝你好运,

答案 1 :(得分:1)

你确实在使用停用词,尽管你可能不会尝试:

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

StandardAnalyzer默认使用标准英语停用词,其中包括“be”。

相关问题