【问题标题】:Lucene search for Longest Common SubstringLucene 搜索最长公共子串
【发布时间】:2017-05-29 18:12:09
【问题描述】:

我使用的是 Lucene 6.0.0,我猜我的问题可以通过 FuzzuQuery 解决,前提是 Lucene 支持 editDistance > 2

我使用的是普通的 Java Lucene API(也不是 SOLR 或 ElasticSearch)。

假设非标记化的索引文本字段是 - This is Ram's House 并且当我使用 Ramram 搜索时,我应该得到 This is Ram's House 作为匹配项,因为从某种意义上说,三个连续字符匹配 - 这是一种具有两个以上编辑距离的模糊匹配要求。

使用My name is Ram and my brother's name is Shyam 搜索也应该给我This is Ram's House 作为匹配项。

最长公共子串中的最小字符数可能有限制,目前我们应该可以限制为三个。

根据我们的分析,有一个业务问题可以通过这种方式解决。

Lucene 可以吗?

是否可以使用任何其他工具 - 例如 SOLR、ElasticSearch 等?

【问题讨论】:

  • 您的两个示例都应该可以在不使用 FuzzyQueries 的情况下进行典型分析。你遇到了什么问题?
  • 什么意思?我正在使用StandardAnalyzer,而不是在索引时标记文本字段。我没有与 FuzzyQueryWildCardQueryTermQueryPhraseQuery 匹配,所以我不确定索引端需要更改什么以及搜索端使用哪种查询。
  • 对,当然不是,它没有被标记化。那么...为什么不标记该字段?
  • 因为我正在寻找可能分布在多个单词中的 N 个连续字符,例如当我为 This is Ram's House 搜索 sram 时,即使 sis 的一部分,我也应该得到匹配。我将用我尝试过的一些代码来更新我的问题。我想,如果我进行标记,每个单词都会有不同的术语。
  • 另外,我的索引数据可能全是数字(没有任何字母),没有任何空格。

标签: java elasticsearch solr lucene


【解决方案1】:

我可以通过在 lucene 中使用 N-Gram 索引技术来解决这个问题 - NGramTokenizer

我根据我的要求选择 minGrammaxGram 值,并且我已经准备好索引子字符串,我可以查询这些术语的索引。

它大大增加了生成和索引术语的数量,但解决了我的问题。

More Explanation here

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 2016-06-03
    • 2010-11-28
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多