1

我有一个包含代码字段的大约 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#。

4

1 回答 1

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”

你可以得到令牌:

  • 肌电图
  • 1090
  • 5
  • 小号

这可能适用于您的情况,但对于查找类似以下内容并没有特别帮助:“MG1”

于 2013-07-02T15:54:13.477 回答