Elasticsearch Запрос для поля с несколькими значениями - PullRequest
0 голосов
/ 25 февраля 2020

Можно ли написать запрос Elasticsearch, который будет возвращать только документы, которые имеют несколько значений в данном поле? Мне все равно, что это за значения, только то, что в поле есть несколько, а не 1.

Я бы хотел, чтобы запрос соответствовал:

{
  "color": ["red", "blue"]
},
{
  "color": ["green", "yellow", "orange"]
}

, но не

{
  "color": "red"
}

В идеале я бы предпочел не использовать скрипты в своем запросе; они отключены на моем кластере.

1 Ответ

2 голосов
/ 26 февраля 2020

Мне неизвестен подход к решению, который работает без использования скрипта. Но у вас есть выбор:

Подготовка: индексировать некоторые образцы документов

POST my_index/_bulk
{"index": {"_id": 1}}
{"color": ["red", "blue"]}
{"index": {"_id": 2}}
{"color": ["green", "yellow", "orange"]}
{"index": {"_id": 3}}
{"color": ["grey"]}

Вариант 1. Использование сценария во время запроса («дорого»)

GET my_index/_search
{
  "query": {
    "script": {
      "script": "doc.color.size() > 1"
    }
  }
}

Вариант 2. Использование сценария во время индексации («дешево»)

(предпочтительный подход, поскольку сценарий выполняется только один раз для каждого документа write)

PUT _ingest/pipeline/set_number_of_colors
{
  "processors": [
    {
      "script": {
        "lang": "painless",
        "source": "ctx.number_of_colors = ctx.color.size()"
      }
    }
  ]
}

POST my_index/_update_by_query?pipeline=set_number_of_colors

GET my_index/_search
{
  "query": {
    "range": {
      "number_of_colors": {"gt": 1}
    }
  }
}

Вы также можете настроить конвейер как конвейер по умолчанию для вашего индекса, так что вам не нужно ничего менять в журнале приложения индексирования c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...