【问题标题】:Fast Infix Searching快速中缀搜索
【发布时间】:2012-03-21 01:15:43
【问题描述】:

我正在构建一个自动完成功能,它必须快速查询超过 10 万个单词/短语,并且遇到了一些问题。我的第一个想法是通过某种 trie/三叉树结构,但这些都是严格的前缀匹配,这对我的应用程序来说还不够好(我想要完整的中缀匹配)。然后我转向了一些更大的解决方案,SqlServer FullText Indexing、Lucene、Solr、Sphinx,但 Lucene 和 SqlServer FullText Indexing 实际上并不是全文,而是带有漂亮特性(soundex、邻近度等)的前缀。我试图想出一种 Levenshtein 编辑距离可以提供帮助的方法,但找不到一种方法既能保证至少相当准确,又能支持具有高编辑距离的单词(即 google 和 ogl。编辑距离为 3,但 3 是在一般情况下提高阈值的方法)。

我的问题是,Google/bing 等强者是如何做到的?他们只是在一段时间后暴力破解吗?我想没有,但我找不到任何支持。

任何帮助将不胜感激!

【问题讨论】:

  • 我想 N-gram 方法可能会有所帮助。然后是 sna-projects.com/cleo 可以满足您的要求。
  • “Lucene 不是全文”?你能详细说明一下吗?看来您的定义与大多数人使用的定义不同。另外,您对 Solr/Lucene/Sphinx/etc 都进行了哪些尝试?你知道 Solr 有一个特定的组件来处理自动完成吗?
  • 我认为全文是指如果我搜索“talli”,则匹配“metallica”。在 sqlserver 和 lucene 下都不是这样。
  • @hermitt : Lucene/Solr 搜索 terms,它可以是单词或单词的一部分或任何你想要的,具体取决于配置。请参阅 aitchnyu 建议的 ngram。

标签: .net autocomplete solr full-text-search sphinx


【解决方案1】:

如果您在 Lucene 中启用 queryParser.setAllowLeadingWildcard(true);,则可以使用前导通配符和尾随通配符,例如:

*talli*

这将提取所有包含“talli”的单字词,包括“Metallica”。

这对您来说可能不够快,但在某些情况下(准确地说,只有前缀通配符搜索)如果您可以预处理查询字符串,您可能能够使用旧的“反转术语和索引还有”把戏:

acillateM

【讨论】:

    【解决方案2】:

    Lucene/Solr 可以很容易地做到这一点。 Lucene/Solr 中的搜索单元是 Term,它通常是一个词,但实际上几乎可以是任何东西,具体取决于 text analysis 的配置方式。

    使用 Solr,有很多方法可以实现这一点(ngrams/shingles、facet prefix、TermsComponent,...)。最新版本的 Solr 带有一个针对 autocomplete based on spell checking 的特定组件。

    【讨论】:

      【解决方案3】:

      当我在 2013 年需要中缀搜索时,我做了一些研究。我找到的唯一方法是Sphinx engine。需要配置它以支持中缀搜索

      index tra
      {
        [...]
        enable_star=1
        min_infix_len=2
      }
      

      在此之后,它以眨眼的方式处理问题。我认为要搜索大约 20 万条记录。我使用本地引擎来模拟内存搜索库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 2011-05-11
        • 2021-01-24
        相关资源
        最近更新 更多