在多值字段中的Solr模糊搜索,其中术语之间的距离最大

时间:2012-08-15 15:49:25

标签: solr lucene fuzzy-search

Hello stackOverflowers

我在Solr文档集合中有一个字段,其中包含一个名为的字段 names_txt - 这是一个multiValue =“true”字段。

此字段包含文档关联人员的所有姓名

我希望能够进行模糊搜索,同时限制匹配条款之间的术语数量。

查询

names_txt:("markus foss"~2)

将返回您找到 markus foss 这些术语的所有文件,其中最多2个术语。

但是当我以模糊方式搜索并且还要指定匹配项之间的最大术语数时,我无法正确理解语法。

查询:

names_txt:(markus~0.7 foss~0.7)

这确实有效,但会返回错误的postives,因为它会在一个值中返回带有“markus something”的文档,而在另一个值中返回“foss somethingElse”。

我想写的是:

(markus~0.7 foss~0.7)~2
  • 但这种语法在solr中是非法的。

那里的任何人都有解决我问题的方法吗?

2 个答案:

答案 0 :(得分:0)

我认为你可以使用SpanQuery来做到这一点。问题是Solr中的常见查询解析器不支持它们。看看那些支持跨度的this article:Surround,Xml-Query-Parser和Qsol。但请检查当前solr版本中每个的状态。

答案 1 :(得分:0)

因为在单个查询中,Solr可以处理单词距离约束或模糊搜索约束,我们需要两个术语:

names_txt:("markus foss"~2) AND names_txt:(markus~0.7 foss~0.7)

请注意,不推荐使用浮点数量化模糊度。在内部,lucene转换器将float数字转换为0到2之间的int,因此我们应该在搜索条件中从头开始使用此整数(Damereau Levenshtein)编辑距离。所以我的最终提案指出:

names_txt:("markus foss"~2) AND names_txt:(markus~1 foss~1)

(对于那些感兴趣的人:可以在this code file的末尾找到将相似性float转换为编辑距离int的已弃用,有点古怪的函数。)