子串Lucene分析器

子串Lucene分析器,lucene,substring,analyzer,Lucene,Substring,Analyzer,我有一个数据库表,其中包含大约40000条包含代码字段的记录,例如 FLEFSU25B-25M EMG1090-5S 我需要能够非常快速地选择包含给定子字符串的所有代码。例如,109与EMG1090-5S匹配 我目前的方法是将代码存储在Lucene中,并使用子字符串对Lucene进行过滤,例如109 但是如果我只存储代码,这不是很有效,因为than Lucene必须搜索所有令牌 为了克服这个问题,我正在考虑创建一个新的分析器,将每个代码拆分为令牌,如下所示: EMG1090-5S MG1090-

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

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

我目前的方法是将代码存储在Lucene中,并使用子字符串对Lucene进行过滤,例如109 但是如果我只存储代码,这不是很有效,因为than Lucene必须搜索所有令牌

为了克服这个问题,我正在考虑创建一个新的分析器,将每个代码拆分为令牌,如下所示: EMG1090-5S MG1090-5S G1090-5S 1090-5S

然后,为了找到子字符串109的所有代码,我可以在109*上搜索,这比我知道的更有效,Lucene按字母顺序存储令牌,就像SQL Server索引一样

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

一个令牌过滤器来完成这个任务,它确实已经存在了!看一看。使用它的分析器可能看起来像:

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);
  }
};
出于您的考虑,可能对您也很有用。它有许多配置选项,可用于在标点和从字母到数字的转换等处进行分隔。因此,使用它,您可以从您的输入中获得:EMG1090-5S

您可以获得代币:

肌电图 1090 5. s
这可能对您的情况很有效,但对于查找类似于:MG1的内容并没有特别的帮助。确实存在一个令牌过滤器来完成这项工作!看一看。使用它的分析器可能看起来像:

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);
  }
};
出于您的考虑,可能对您也很有用。它有许多配置选项,可用于在标点和从字母到数字的转换等处进行分隔。因此,使用它,您可以从您的输入中获得:EMG1090-5S

您可以获得代币:

肌电图 1090 5. s 这可能对您的案例很有效,但对于查找类似于:MG1的内容并没有特别大的帮助