我尝试了许多 lucene 分析器,发现关键字分析器最符合我的要求。我使用相同的关键字分析器来更新文档和使用 QueryParser 搜索相同的文档。我想搜索支持通配符的值。例如:如果字段“country”包含值“india”,我可以搜索与“ind*”、“ ndi ”相同的字段“,印度等。除了完全匹配之外,我得到了所有其他搜索的匹配。即,当我搜索确切的单词(国家:印度)时,我没有得到任何匹配。如果我将相同的查询更改为“国家:印度*”或“国家:印度?”,我得到了匹配。我还有另一个疑问,如果有一个名为“not”的国家,我该如何搜索。我试过“国家: "not"" 和 "country:\not"。但都失败了。这两种情况下到底发生了什么?请帮忙。
问问题
331 次
1 回答
1
我怀疑您在国名后有一些空格或其他无关字符。您可以在将输入添加到 Lucene 之前对其进行修剪,或者实现自定义关键字分析器,然后添加一个TrimFilter
类似的内容:
public final class CustomKeywordAnalyzer extends Analyzer {
public CustomKeywordAnalyzer() {
}
@Override
protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) {
Tokenizer tokenizer = new KeywordTokenizer(reader)
TokenStream filter = new TrimFilter(Version.LUCENE_43, tokenizer);
return new TokenStreamComponents(tokenizer, filter);
}
}
至于搜索“not”,它只是小写就足够了,它不会被解释为布尔运算符(根据文档AND
,运算OR
符NOT
必须是大写的)。但是,这些词会被标准英语捕捉到,例如. 你确定你只是在查询时使用吗?StopFilter
StandardAnalyzer
KeywordAnalyzer
尽管如此,避免查询解析器保留字的可靠方法是完全绕过查询解析器,并自己构建查询:
Query query = new TermQuery(new Term("country", userQuery));
于 2013-10-28T17:46:27.567 回答