如何在弹性搜索中进行精确匹配?
how to do exact match in elastic search?
我想找到完全匹配。如果没有匹配。我不想 null。
我正在搜索这个id 6a8c283f-1e75-ec11-8943-000d3a15f525
。
它给了我这个输出
- fcf0dd4e-abbc-ec11-983f-0022482588e9
但是只有这些不匹配ec11
匹配
我试过这个搜索查询
result = await client.search({
index: 'products',
"query": {
"match": {
"sysid":sysid
}
}
})
问题是因为您的 sysid
字段是 text
类型,因此在索引时被分析并标记为 fcf0dd4e
、abbc
、ec11
、8943
和 000d3a15f525
.
此外,当使用匹配查询进行搜索时,搜索词也会被分析为以下标记 6a8c283f
、1e75
、ec11
、8943
、000d3a15f525
.
如您所见,匹配成功是因为 ec11
匹配。
对于完全匹配,您需要做的是 运行 您对 keyword
字段的查询。也许你很幸运,你的映射已经包含 sysid.keyword
sub-field。如果不是,您需要更改映射并重新索引数据。
然后您将能够 运行 您的 term
查询并获得完全匹配:
"term": {
"sysid.keyword":sysid
}
我想找到完全匹配。如果没有匹配。我不想 null。
我正在搜索这个id 6a8c283f-1e75-ec11-8943-000d3a15f525
。
它给了我这个输出
- fcf0dd4e-abbc-ec11-983f-0022482588e9
但是只有这些不匹配ec11
匹配
我试过这个搜索查询
result = await client.search({
index: 'products',
"query": {
"match": {
"sysid":sysid
}
}
})
问题是因为您的 sysid
字段是 text
类型,因此在索引时被分析并标记为 fcf0dd4e
、abbc
、ec11
、8943
和 000d3a15f525
.
此外,当使用匹配查询进行搜索时,搜索词也会被分析为以下标记 6a8c283f
、1e75
、ec11
、8943
、000d3a15f525
.
如您所见,匹配成功是因为 ec11
匹配。
对于完全匹配,您需要做的是 运行 您对 keyword
字段的查询。也许你很幸运,你的映射已经包含 sysid.keyword
sub-field。如果不是,您需要更改映射并重新索引数据。
然后您将能够 运行 您的 term
查询并获得完全匹配:
"term": {
"sysid.keyword":sysid
}