为什么 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”。
对于我正在搜索的特定 属性,使用 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”。