Lucene Analyzer用于简单的直接现场搜索

时间:2013-10-28 08:53:59

标签: java search lucene

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

1 个答案:

答案 0 :(得分: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”而言,它只是小写应该足以让它不被解释为布尔运算符(ANDORNOT运算符必须按the documentation)大写。这些单词将被标准英语StopFilter捕获,例如StandardAnalyzer使用的单词。您确定在查询时只使用KeywordAnalyzer吗?

但是,除此之外,避免查询解析器保留字的确定方法是完全绕过查询解析器,并自己构造查询:

Query query = new TermQuery(new Term("country", userQuery));