【问题标题】:Lucene analyzer for substrings子字符串的 Lucene 分析器
【发布时间】:2013-07-02 06:44:41
【问题描述】:

我有一个包含大约 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#。

【问题讨论】:

    标签: lucene substring analyzer


    【解决方案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
    • S

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

    【讨论】:

      猜你喜欢
      • 2013-02-20
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2011-07-25
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多