【问题标题】:Lucene Analyzer tokenizer for substring search用于子字符串搜索的 Lucene Analyzer 标记器
【发布时间】:2015-06-01 16:01:07
【问题描述】:

我需要一个可以执行以下操作的 Lucene Tokenizer。给定字符串“wines bottle caps”,下面的查询应该会成功

  • 葡萄酒
  • 底部
  • 上限
  • ottl
  • aps
  • 酒瓶

这是我目前所拥有的。我该如何修改它才能工作?少于三个字符的查询不应该有效。

public class PorterAnalyzer extends Analyzer {

  private final Version version;

  public PorterAnalyzer(Version version) {
    this.version = version;
  }

  @Override
  @SuppressWarnings("resource")
  protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    final StandardTokenizer src = new StandardTokenizer(reader);
    TokenStream tok = new StandardFilter(src);
    tok = new LowerCaseFilter( tok);
    tok = new StopFilter( tok, StandardAnalyzer.STOP_WORDS_SET);
    tok = new PorterStemFilter(tok);
    return new TokenStreamComponents(src, tok);
  }

}

【问题讨论】:

    标签: java lucene tokenize analyzer


    【解决方案1】:

    我认为您正在搜索NGramTokenFilter

    试一试,例如:

    tok=new NGramTokenFilter(tok,2,5);
    

    【讨论】:

    • 你能解释一下 minGram 和 maxGram 的作用吗?基本上我怎么知道这些值对于不同的查询应该是什么?
    • 我对 Lucene 很陌生,一开始我不知道 N-gram 是什么。谢谢
    • 当您搜索“ottl”时,您没有得到任何结果,因为您的索引中只包含“bottle”。但是您可以在索引过滤器链中添加一个 NGramTokenFilter。这将添加至少 minGram(即 2)和最大 maxGram 字母(即 5)的所有可能部分。因此,例如 2 个字母:bo、ot、tt ... 和 3 个字母 bot、ott、ottl、... 和 4... 和 5 个字母:bottl 和 ottle
    • 听起来 maxGram 是个问题。对于需要添加到索引的每个文档,我必须即时计算 maxGram。例如,如果标题是“编程语言 java”;然后我需要将 maxGram 重新计算为 11,以便 programmi 受到打击。每次都必须重新计算 maxGram 是不可扩展的。我需要能够将编写器实例化为writer = new IndexWriter(index, config) 并使用它来添加许多文档。每次都必须指定 maxGram 似乎是不可能的。 你知道其他方法吗?
    • 您不需要重新计算 maxGram。如果你想要一个单词的“所有”部分,你可以为 maxGram 使用一个非常高的值,即 50 - 所以它适用于最多 51 个字母的所有单词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多