【问题标题】:Elastic search giving strange results弹性搜索给出奇怪的结果
【发布时间】:2018-05-12 15:36:43
【问题描述】:

我正在关注this 弹性搜索教程。

两名员工的“约”值为:

“about”:“我喜欢去攀岩”

"about": "我喜欢收集摇滚专辑"

我运行以下查询:

GET /megacorp/employee/_search {"query":{"match":{"about":"rock coll"}}}

以上两个条目都返回,但令人惊讶的是分数相同:

“_score”:0.2876821

第二个不应该有更高的分数,因为它的'about'值包含'rock'和'coll',而第一个只包含'rock'?

【问题讨论】:

  • 为什么要投反对票?
  • 我没有投反对票,但可能是因为您没有提供映射。

标签: elasticsearch


【解决方案1】:

这完全取决于您使用的分析仪。如果您使用标准或英文分析仪,则此结果是正确的。我建议您花一些时间使用 elasticsearch 的 Analyze API 来熟悉每个分析器如何影响您的文本。

顺便说一句,如果您希望第二个文档获得更高的分数,请查看Partial matching

【讨论】:

    【解决方案2】:

    当我们在一个全文字段上进行搜索时,我们需要将查询字符串通过与我们在我们索引一个文档,以确保我们搜索的术语与索引中存在的术语格式相同。
    分析过程通常包括规范化和标记化(字符串被标记器标记为单独的术语)。

    至于匹配查询
    如果您对全文字段运行匹配查询,它将在执行搜索之前使用该字段的正确分析器来分析查询字符串。它只查找指定的单词。

    因此,在您的 match 查询中,Elasticsearch 将查找整个单独单词的出现:rock 或/和coll
    您的第二个文档不包含单独的单词 coll,但与单词 rock 匹配。 结论:2个文档在_score值上是等价的(它们被同一个词rock匹配)

    【讨论】:

      【解决方案3】:

      Elasticsearch 在存储之前分析每个 text 字段。默认分析器 (standard analyzer) 根据空格拆分文本并将其小写。分析过程的输出是用于匹配查询标记的标记列表。如果任何标记完全匹配,则返回相关文档。话虽如此,您的第二个文档不包含标记 col,这就是为什么您的两个文档得分相同。

      即使您构建自定义分析器并使用stemming,单词collect 也不会被称为coll

      您可以构建自定义分析器,在其中您可以指定标记的长度应为 1 个字符,然后Elasticsearch 会将每个单个字符视为一个标记,您可以搜索文档中是否存在任何字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 2013-08-20
        相关资源
        最近更新 更多