我有一个包含大约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#。
答案 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”
你可以得到令牌:
哪种情况可能适用于您的情况,但在找到类似“MG1”
之类的内容时不会特别有用