【问题标题】:Lucene Analyzer for a simple direct field search用于简单直接字段搜索的 Lucene Analyzer
【发布时间】:2013-10-28 08:53:59
【问题描述】:

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

【问题讨论】:

    标签: java search lucene


    【解决方案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 运算符必须是大写,每个 @987654322 @)。不过,这些词会被标准英语StopFilter 捕捉到,例如StandardAnalyzer 使用的那个。确定查询时只使用KeywordAnalyzer

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

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

    【讨论】:

    • 感谢您的宝贵回答。虽然它不能完全解决我的问题。它帮助我理解了很多事情,这样我就可以自己解决剩下的事情了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多