我有一个数据库表,包含大约40,000条记录,其中包含代码字段,例如FLEFSU25B-25M EMG1090-5S。
我需要能够非常迅速地选择所有包含给定子字符串的代码。例如,"109“匹配EMG1090-5S。
我目前的方法是将代码存储在Lucene中,并通过子字符串进行Lucene过滤器--比如109,但是如果我只存储代码,那就不太有效了,因为Lucene必须搜索所有的令牌。
为了克服这一问题,我正在考虑创建一个新的分析器,将每个代码拆分为令牌,如下所示: EMG1090-5S
MG1090-5S G1090-5S 1090-5S ...然后,要查找带有子字符串109的所有代码,我可以在109*上搜索,这要高效得多(我了解Lucene按字母顺序存储令牌,就像Server索引一样)。
这有道理吗?这样的分析器是否已经存在?我正在使用.Net/C#。
发布于 2013-07-02 15:54:13
实现这一点的令牌过滤器确实已经存在了!看看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也可能对您有用。它有许多信任选项,可以用来分隔标点符号和从字母到数字的转换,因此,您可以从输入中获得“etc 1090-5s”。
你可以得到代币:
这可能对您的情况很好,但对于查找类似"MG1“之类的内容却没有特别的帮助。
https://stackoverflow.com/questions/17419072
复制相似问题