【问题标题】:Fuzzy substring matching in a string Lucene.NETLucene.NET 字符串中的模糊子字符串匹配
【发布时间】:2018-03-23 18:14:55
【问题描述】:

我刚刚安装了 Lucene.NET。

我正在进行文本搜索。 我想检查一个大文本是否包含/模糊匹配一个单词/短语,比如:

例1:

文本: “我在 stackoverflow 上发布了一个关于 Lucene.NET 的问题。我会得到答案吗?”

textToSearch: "posted a question abot Lucene"

这 2 个应该是匹配的,因为 text 包含 textToSearch(除了小错字 abot -> about.

Lucene.NET 库可以做到这一点吗?

如果不支持,它是否至少支持文本中的单个单词模糊匹配?

例如:

文本:“我在 stackoverflow 上发布了一个问题”

textToSearch "stackovrlow"(拼写错误)

【问题讨论】:

    标签: c# .net lucene lucene.net fuzzy-search


    【解决方案1】:

    是的,Lucene.Net 支持文本中的单一模糊匹配。您可以在 FuzzyQuery 的帮助下完成。

    不幸的是,您只能以某种方式模仿第一个示例的行为。一种可能的解决方案是创建大的BooleanQuery,每个子句都是FuzzyQuery,但这也会导致性能不佳,因为它会丢失术语的顺序。

    另一种可能性是使用SpanNearQuery,这将有助于存储位置(您可以指定所需的斜率),但不可能将 FuzzyQuery 添加为子句(您只能以某种方式尝试使用SpanRegexQuery

    【讨论】:

      【解决方案2】:

      Mysterion 是对的,Span Queries 可以提供帮助,但说 FuzzyQueries 不能使用是错误的。这就是SpanMultiTermQueryWrapper 的用途。像这样的:

      SpanQuery query = new SpanNearQuery.Builder("myField", true).
          .addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "question"))))
          .addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "abot"))))
          .addClause(new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("myField", "lucene"))))
          .build();
      

      顺便提一下,当手动构建查询(而不是使用查询解析器)时,您需要考虑分析,因为它们不会通过分析器运行。

      【讨论】:

      • 一般 Lucene 是对的,但不幸的是,Lucene.Net 并非如此,因为 Lucene.Net 是 java Lucene 的一个非常过时的版本
      • @Mysterion - 啊,你是对的,我的错。原以为最高可达 4.X,但显然是 still in beta
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2012-02-14
      • 2014-11-02
      • 1970-01-01
      • 2018-05-31
      • 2021-04-19
      • 2015-03-26
      相关资源
      最近更新 更多