我正在尝试搜索几个字段,除非我使用术语“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() );
答案 0 :(得分:4)
默认情况下,StandardAnalyzer使用一组停用词来排除文本中索引术语的“噪音”。我认为在标准分析器的上下文中,“BE”通常被认为是一个停用词。
幸运的是,你有几个选择
显而易见的一种方法是将一组空的停用词传递给所使用的StandardAnalyzer的构造函数。
但是,查看字段的名称(“flag”和“type”),它们看起来并不完全是为了包含简单的文本,但更可能包含编码的单词。考虑到这一点,您可能会发现关键字分析器更适合。
祝你好运,答案 1 :(得分:1)
你确实在使用停用词,尽管你可能不会尝试:
QueryParser qp = new QueryParser(Version.LUCENE_30,
"type", new StandardAnalyzer(Version.LUCENE_30));
StandardAnalyzer
默认使用标准英语停用词,其中包括“be”。