为什么 elasticsearch 查询需要一定数量的字符才能获得 return 结果?

Why do elasticsearch queries require a certain number of characters to return results?

对于我正在搜索的特定 属性,使用 elasticsearch 获取结果似乎至少需要一个字符。它被称为 'guid' 并具有以下配置:

    "guid": {
        "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }

我有一个具有以下 GUID 的文档:3e49996c-1dd8-4230-8f6f-abe4236a6fc4

以下查询 returns 文件如预期:

{"match":{"query":"9996c-1dd8*","fields":["guid"]}}

但是这个查询没有:

{"match":{"query":"9996c-1dd*","fields":["guid"]}}

我与 multi_match 和 query_string 查询的结果相同。我无法在文档中找到任何关于字符最小值的信息,那么这里发生了什么?

Elastic 没有最低字符数要求。重要的是生成的令牌。

一个有助于理解的练习是使用 _analyzer 查看您的索引标记。

GET index_001/_analyze
{
  "field": "guid",
  "text": [
    "3e49996c-1dd8-4230-8f6f-abe4236a6fc4"
  ]
}

您指定了术语 3e49996c-1dd8-4230-8f6f-abe4236a6fc4。 看看令牌如何:

 "tokens" : [
    {
      "token" : "3e49996c",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "1dd8",
      "start_offset" : 9,
      "end_offset" : 13,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "4230",
      "start_offset" : 14,
      "end_offset" : 18,
      "type" : "<NUM>",
      "position" : 2
    },
    {
      "token" : "8f6f",
      "start_offset" : 19,
      "end_offset" : 23,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "abe4236a6fc4",
      "start_offset" : 24,
      "end_offset" : 36,
      "type" : "<ALPHANUM>",
      "position" : 4
    }
  ]

执行搜索时,搜索中将使用索引中使用的同一分析器。 当您搜索术语“9996c-1dd8*”时。

GET index_001/_analyze
{
  "field": "guid",
  "text": [
    "9996c-1dd8*"
  ]
}

生成的令牌是:

{
  "tokens" : [
    {
      "token" : "9996c",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "1dd8",
      "start_offset" : 6,
      "end_offset" : 10,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

请注意,倒排索引将具有标记 1dd8,而术语“9996c-1dd8*”生成标记“1dd8”,因此匹配发生。

当您使用术语“9996c-1dd*”进行测试时,没有匹配的标记,因此没有结果。

GET index_001/_analyze
{
  "field": "guid",
  "text": [
    "9996c-1dd*"
  ]
}

代币:

{
  "tokens" : [
    {
      "token" : "9996c",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "1dd",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

令牌“1dd”不等于“1dd8”。