【问题标题】:Elasticsearch EdgeNgram not returning shorter results firstElasticsearch EdgeNgram 不首先返回较短的结果
【发布时间】:2015-08-27 15:13:22
【问题描述】:

当我在一个字段上搜索时,评分似乎没有考虑字段的长度(即文本较长的文档的评分与较短的文档相同,并且由于某种原因放在前面)。不知道我做错了什么。

字段的索引如下:

"name": {
        "type": "string",
        "analyzer": "autocomplete"
      },
"_alias": {
        "type": "string",
        "analyzer": "autocomplete"
      }

分析器:

"autocomplete": {
        "char_filter": [
          "special_character_mapping"
        ],
        "filter": [
          "lowercase",
          "autocomplete_filter"
        ],
        "tokenizer": "whitespace"
      }

过滤器:

"autocomplete_filter": {
                "type": "edge_ngram",
                "min_gram": 1,
                "max_gram": 20
              }

查询 1:

{
    "query": {
        "multi_match": {
            "query": "brown fo",
            "type": "most_fields",
            "fields": [
                "name",
                "_alias"
            ],
            "use_dis_max": true,
            "tie_breaker": 1,
            "minimum_should_match": "100%",
            "analyzer": "standard"
        }
    }
}

这会返回很多类似的文档:

  • 棕狐
  • 棕狐
  • 布朗尼为

最后在第 10 位左右:

  • 棕狐

更何况还有一个文档(棕狐树)在第 15 位左右还有一个别名“Brown”没有考虑在内。

查询 2:

{
    "query": {
        "multi_match": {
            "query": "brown fo",
            "type": "cross_fields",
            "fields": [
                "name",
                "_alias"
            ],
            "use_dis_max": true,
            "tie_breaker": 1,
            "minimum_should_match": "100%",
            "analyzer": "standard"
        }
    }
}

这会返回更好的结果:

  • 棕狐树
  • 棕狐
  • 棕狐

2nd 和 3d 文档的评分始终相同。第一个有一个别名“Brown”,理所当然地在前面。

我尝试了各种 multi_match 类型和 query_string 但结果都是一样的。

如何将文本较短的文档(lucene应该自己做?)放在其余文档的前面?

【问题讨论】:

  • 我有两点:1)为什么您在查询中指定 standard 分析器,即使您已将 autocomplete 指定为您搜索的字段的搜索和索引分析器,以及 2)您在您的 autocomplete 分析器中缺少 "type": "custom"
  • 标准应该用于搜索时间(elastic.co/guide/en/elasticsearch/guide/current/…)。虽然不知道类型,但它是如何在代码中丢失的。如果你不输入 type: "custom" 是什么意思?
  • 您是否尝试过添加?explain=true 来查看得分是如何计算的?

标签: elasticsearch


【解决方案1】:

由于您的字段 name_alias 已使用 autocomplete 分析器指定(请注意,由于您仅在索引时使用该分析器,因此您应该指定 index_analyzer 而不是 analyzer),您的输入将是:

  1. 由空格分隔
  2. 步骤 1 中的标记将小写
  3. 步骤 2 中的小写标记将被拆分为前缀

所以对于你上面给出的所有输入文本,它是这样的:

棕狐 => b, br, bro, brow, brown, browne, browned, f, fo, fox

棕狐 => b, br, bro, brow, brown, browni, brownis, brownish, f, fofoxfoxefoxes

布朗尼 => b, br, bro, brow, brown, browny, f, fo, for

棕狐 => b, br, bro, brow, brown, f, fo, fox

棕狐树 => b, br, bro, brow, brown, f, fo, fox, ttrtretree

现在,当您使用 standard 分析器搜索 brown fo 时,搜索标记将为:brownfo

如您所见,brownfo 标记出现在上述所有搜索词中,因此它们基本上是等价的。唯一会影响评分(以及排序顺序)的是这些术语是否已在 name_alias 字段(或两者)中找到,以及您正在使用的字段匹配的 type 是什么。没有看到具体的文档很难说,但您绝对应该尝试将?explain=true 添加到您的查询中,以更深入地了解评分的计算方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2013-06-29
    • 2023-04-09
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多