字符串Lucene.NET中的模糊子串匹配

时间:2017-10-11 23:12:53

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

我刚刚安装了Lucene.NET。

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

Eg1:

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

textToSearch:"发布了一个问题:Lucene"

这两个应该是一个匹配,因为文本包含textToSearch(除了samll拼写abot - > about。

Lucene.NET库可以实现吗?

如果没有,它是否支持文本中至少单字模糊匹配?

例如:

text:"我在stackoverflow"

上发布了一个问题

textToSearch" stackovrlow" (麻烦)

2 个答案:

答案 0 :(得分:1)

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

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

另一种可能性是使用SpanNearQuery来帮助存储位置(你可以指定所需的slop),但是不可能将FuzzyQuery作为子句添加(你只能以某种方式尝试使用{{3 }})

答案 1 :(得分:1)

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();

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

相关问题