如何解决Elasticsearch 仅匹配且准确地匹配标签数组中的给定标签
举个例子,有四个文档
{id: 1,tags :["cat","dog","horse"]}
{id: 2,tags :["dog","cat"]}
{id: 3,tags :["cat"]}
{id: 4,tags :["dog"]}
如何构造这样的查询?
解决方法
[更新]:更新的答案适用于 5.x 和 7.x。
您可以为 tags
和 term
查询添加长度过滤器。请参阅下面的示例,使用所提供的数据。
对于高于 5.x 的版本(在 7.x 上测试),这需要以特定方式为索引创建映射(如下所述)。
-
将
type
的tags
设置为keyword
PUT /my-index/_mapping {"properties":{"id":{"type":"integer"},"tags":{"type":"keyword"}}}
-
OR 将
type
的tags
设置为text
,并为fieldata
启用tags
。PUT /my-index/_mapping {"properties":{"id":{"type":"integer"},"tags":{"type":"text","fielddata":true}}}
5.x 不需要这种严格的映射。
映射后,索引文档:
PUT /_bulk
{"create": {"_index": "my-index","_id": 1}}
{"id": 1,"tags" :["cat","dog","horse"]}
{"create": {"_index": "my-index","_id": 2}}
{"id": 2,"dog"]}
{"create": {"_index": "my-index","_id": 3}}
{"id": 3,"tags" :["cat"]}
{"create": {"_index": "my-index","_id": 4}}
{"id": 4,"tags" :["dog"]}
现在搜索索引文档:
GET my-index/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"tags": {
"value": "cat"
}
}
},{
"script": {
"script": "doc['tags'].length == 1"
}
}
]
}
}
}
结果应该返回预期的文档。
重要说明:以上步骤适用于 5.x,但有一处更改:您需要在操作 because you can have more than one document types (and mappings) in one index in ES 5.x 中提供文档类型 (_type
)。
Elasticsearch 评分算法为具有确切搜索词的文档提供最高分,即在您的情况下为 cat
,并且由于您只需要包含完全 cat
的文档,您可以使用 {{1} } param 为 1 值,这样您的结果会更快,因为脚本在搜索期间遍历每个文档时速度很慢。
添加工作示例。
索引示例文档
POST /index/_doc/1
size
文档 2
{
"id": 1,"tags": [
"cat","horse"
]
}
文档 3
{
"id": 2,"tags": [
"dog","cat"
]
}
文档 4
{
"id": 3,"tags": [
"cat"
]
}
和搜索查询
{
"id": 4,"tags": [
"dog"
]
}
返回搜索结果
{
"size": 1,// Note
"query": {
"bool": {
"must": [
{
"term": {
"tags": {
"value": "cat"
}
}
}
]
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。