Во всех моих документах есть поле tags
типа Array
. Я хочу найти и вернуть все документы, которые имеют перекрестокtags
с массивом пользовательского ввода. Количество элементов является переменным, а не фиксированным размером.
Примеры:tags:["python", "flask", "gunicorn"]
input:["python"]
true
, потому что все элементы в input
находятся в tags
.tags:["nginx", "pm2"]
input:["nodejs", "nginx", "pm2", "microservice"]
false
, потому что "nodejs"
и "microservice"
нет в tags
.Я просмотрел запрос terms
, но не думаю, что он работает для массивов.
Я также нашел это, Свойство массива Elasticsearch должно содержать заданные элементы массива., но решение для старых версий Elasticsearch, и синтаксис изменился.
Я полагаю, вы ищете 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" : [ ]
}
Спасибо, это сработало. Я не могу поверить, что не смог найти этот кусок документации с огромным количеством поиска в Google, который я сделал.