Lucene分析器用于子串

时间:2013-07-02 06:44:41

标签: lucene substring analyzer

我有一个包含大约40,000条包含代码字段的记录的数据库表,例如 FLEFSU25B-25M EMG1090-5S

我需要能够非常快速地选择包含给定子字符串的所有代码。例如,“109”与EMG1090-5S匹配。

我目前的方法是将代码存储在Lucene中并通过子字符串进行Lucene过滤 - 例如 109 但是,如果我只存储代码,那效果不是很高,因为Lucene必须搜索所有代码。

为了解决这个问题,我正在考虑创建一个新的分析器,将每个代码分成标记,如下所示:     EMG1090-5S
     MG1090-5S
      G1090-5S
       1090-5S
    ...

然后要查找子字符串109的所有代码,我可以搜索109 *,效率更高(我理解Lucene按字母顺序存储令牌,就像SQL Server索引一样)。

这有意义吗? 这样的分析仪是否已经存在?我正在使用.Net / C#。

1 个答案:

答案 0 :(得分:1)

实现此目的的令牌过滤器确实已经存在!看看EdgeNGramTokenFilter。使用它的Analyzer可能类似于:

Analyzer analyzer = new Analyzer() {
 @Override
  protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    KeywordTokenizer source = new KeywordTokenizer(reader);
    LowercaseFilter filter = new LowercaseFilter(source);
    filter = new EdgeNGramTokenFilter(filter, EdgeNGramTokenFilter.Side.BACK, 2, 50);
    return new TokenStreamComponents(source, filter);
  }
};

为了您的考虑,WordDelimiterTokenizer也可能对您有用。它有许多配置选项,可用于分隔标点符号和从字母到数字等的转换。因此,您可以从输入中获取:“EMG1090-5S”

你可以得到令牌:

  • EMG
  • 1090
  • 5
  • 取值

哪种情况可能适用于您的情况,但在找到类似“MG1”

之类的内容时不会特别有用