【问题标题】:Solr Fuzzy search in multiValued field with max distance between termsSolr 在多值字段中进行模糊搜索,术语之间的距离最大
【发布时间】:2012-08-15 15:49:25
【问题描述】:

你好 stackOverflowers

我在 Solr 文档集合中有一个字段,该字段名为 names_txt - 这是一个 multiValue="true" 字段。

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

我希望能够进行模糊搜索,同时限制匹配项之间的项数。

查询

names_txt:("markus foss"~2)

将返回您找到术语 markusfoss 的所有文档,其中它们之间最多存在 2 个术语。

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

查询:

names_txt:(markus~0.7 foss~0.7)

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

我想写的是:

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

有人可以解决我的问题吗?

【问题讨论】:

    标签: solr lucene fuzzy-search


    【解决方案1】:

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

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

    请注意,不推荐使用浮点数来量化模糊性。在内部,lucene converts 将 float 数字转换为介于 0 和 2 之间的 int,因此我们应该在搜索词的开头使用这个整数 (Damereau Levenshtein) 编辑距离。所以我的最终提案指出:

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

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

    【讨论】:

    • 这真的有用吗?它会在 2 个单词的距离内查找 exact 单词“markus”和“foss”。因此,附加的模糊条件不再起作用。
    • 知道为什么它被弃用了吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多