Elasticsearch EdgeNgram不会首先返回较短的结果

Tib*_*vic 5 elasticsearch

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

字段的索引如下:

"name": {
        "type": "string",
        "analyzer": "autocomplete"
      },
"_alias": {
        "type": "string",
        "analyzer": "autocomplete"
      }
Run Code Online (Sandbox Code Playgroud)

分析:

"autocomplete": {
        "char_filter": [
          "special_character_mapping"
        ],
        "filter": [
          "lowercase",
          "autocomplete_filter"
        ],
        "tokenizer": "whitespace"
      }
Run Code Online (Sandbox Code Playgroud)

过滤:

"autocomplete_filter": {
                "type": "edge_ngram",
                "min_gram": 1,
                "max_gram": 20
              }
Run Code Online (Sandbox Code Playgroud)

查询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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会返回很多文档,如:

  • 褐色的狐狸
  • 褐狐狸
  • 布朗尼

最后在第10位左右:

  • 布朗狐狸

更不用说在第15个左右有一个文件(布朗狐狸树)也有一个别名"布朗",没有考虑到.

查询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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会返回更好的结果:

  • 布朗狐狸树
  • 褐狐狸
  • 布朗狐狸

第二和第三文件总是得分相同.第一个有一个别名"布朗",正确地在前面.

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

如何获得文本较短的文件(lucene应该自己做?)在其他文件前面?

Val*_*Val 0

由于您的字段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, fo, fox, foxe,foxes

布朗尼=> 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, t, tr, tre,tree

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

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