首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >丝子用Lucene分析仪

丝子用Lucene分析仪
EN

Stack Overflow用户
提问于 2013-07-02 06:44:41
回答 1查看 1.6K关注 0票数 1

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

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

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

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

代码语言:javascript
复制
  MG1090-5S
代码语言:javascript
复制
   G1090-5S
代码语言:javascript
复制
    1090-5S
代码语言:javascript
复制
 ...

然后,要查找带有子字符串109的所有代码,我可以在109*上搜索,这要高效得多(我了解Lucene按字母顺序存储令牌,就像Server索引一样)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-02 15:54:13

实现这一点的令牌过滤器确实已经存在了!看看EdgeNGramTokenFilter。使用它的Analyzer可能如下所示:

代码语言:javascript
复制
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”。

你可以得到代币:

  • 肌电
  • 一零九0
  • 5
  • S

这可能对您的情况很好,但对于查找类似"MG1“之类的内容却没有特别的帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17419072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档