我所有的文档都有一个字段tags
,类型为Array
。我想搜索并返回具有用户输入数组的tags
的交点的所有文档。元素的数量是可变的,而不是固定的大小。
示例:
tags:["python", "flask", "gunicorn"]
input:["python"]
true
,因为所有中的元素在input
中。 tags
tags:["nginx", "pm2"]
input:["nodejs", "nginx", "pm2", "microservice"]
,因为false
和"nodejs"
不在"microservice"
中。我调查了tags
查询,但我认为它不适用于数组。
我也找到了Elasticsearch array property must contain given array items,但是解决方案是针对旧版本的Elasticsearch,语法已经更改。
答案 0 :(得分:0)
我相信您正在寻找terms_set
-参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-set-query.html
PUT tags
POST tags/_doc
{
"tags": ["python", "flask", "gunicorn"]
}
POST tags/_doc
{
"tags": ["nginx", "pm2"]
}
GET tags/_search
{
"query": {
"terms_set": {
"tags": {
"terms": ["nginx", "pm2"],
"minimum_should_match_script": {
"source": "params.num_terms"
}
}
}
}
}
返回:
"hits" : {
"total" : 1,
"max_score" : 0.5753642,
"hits" : [
{
"_index" : "tags",
"_type" : "_doc",
"_id" : "XZqN_mkB94Kxh8PwtQs_",
"_score" : 0.5753642,
"_source" : {
"tags" : [
"nginx",
"pm2"
]
}
}
]
}
查询示例中的完整列表
GET tags/_search
{
"query": {
"terms_set": {
"tags": {
"terms": ["nodejs", "nginx", "pm2", "microservice"],
"minimum_should_match_script": {
"source": "params.num_terms"
}
}
}
}
}
没有得到预期的结果:
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}