使用 edge_ngram 进行搜索的 Elastic returns 意外结果

Elastic returns unexpected result from Search using edge_ngram

我正在研究如何将我的数据存储在 elasticsearch 中。首先,我尝试了模糊功能,虽然它工作正常,但我没有收到预期的结果。之后,我尝试了 ngram,然后是 edge_ngram 分词器。 edge_ngram 分词器看起来像一个自动完成功能。正是我所需要的。但它仍然给出了意想不到的结果。我配置 min 1max 5 以获取所有以我搜索的第一个字母开头的结果。虽然这有效,但我仍然会在继续输入时得到这些结果。

示例:我有一个名称字段,其中填充了名为 The New York TimesThe Guardian 的文档。现在,当我搜索 T 时,两者都按预期发生。但当我搜索 TTTTT 等时,也会发生同样的情况。

在这种情况下,无论我是在 Kibana 中还是从我的应用程序(在所有字段上使用 MultiMatch)执行搜索都没有关系。 Kibana 甚至向我展示了它与单个字母 T 匹配。

那么我错过了什么?我怎样才能像使用自动完成一样获得结果但又不会有太多结果?

定义索引映射时,需要指定 search_analyzer 作为标准。如果没有显式定义 search_analyzer,则默认情况下 elasticsearch 认为 search_analyzer 与指定的 analyzer 相同。

添加包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 5,
          "token_chars": [
            "letter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "standard"      // note this
      }
    }
  }
}

索引数据:

{
    "name":"The Guardian"
}
{
    "name":"The New York Times"
}

搜索查询:

{
  "query": {
    "match": {
      "name": "T"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "69027911",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.23092544,
        "_source": {
          "name": "The New York Times"
        }
      },
      {
        "_index": "69027911",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.20824991,
        "_source": {
          "name": "The Guardian"
        }
      }
    ]