1

我尝试了许多 lucene 分析器,发现关键字分析器最符合我的要求。我使用相同的关键字分析器来更新文档和使用 QueryParser 搜索相同的文档。我想搜索支持通配符的值。例如:如果字段“country”包含值“india”,我可以搜索与“ind*”、“ ndi ”相同的字段“,印度等。除了完全匹配之外,我得到了所有其他搜索的匹配。即,当我搜索确切的单词(国家:印度)时,我没有得到任何匹配。如果我将相同的查询更改为“国家:印度*”或“国家:印度?”,我得到了匹配。我还有另一个疑问,如果有一个名为“not”的国家,我该如何搜索。我试过“国家: "not"" 和 "country:\not"。但都失败了。这两种情况下到底发生了什么?请帮忙。

4

1 回答 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,运算ORNOT必须是大写的)。但是,这些词会被标准英语捕捉到,例如. 你确定你只是在查询时使用吗?StopFilterStandardAnalyzerKeywordAnalyzer

尽管如此,避免查询解析器保留字的可靠方法是完全绕过查询解析器,并自己构建查询:

Query query = new TermQuery(new Term("country", userQuery));
于 2013-10-28T17:46:27.567 回答