Elasticsearch фильтрация с входным массивом, где - PullRequest
1 голос
/ 19 января 2020

Наше требование состоит в том, чтобы отфильтровать объекты по полю массива данных, передав входной массив известичевидить. Любая комбинация элементов входного массива совпадает с упоминанием массива.

Малый пример

data:[
  {"name": "xxxx", "mentions": ["X", "Y"]},
  {"name": "yyyy", "mentions": ["K", "L", "M"]},
  {"name": "zzz", "mentions": ["X", "L"]},
]  
Input: [X, Y, K, L]
Output:[
  {"name": "xxxx", "mentions": ["X", "Y"]},
  {"name": "zzz", "mentions": ["X", "L"]}
]

Объекты должны быть отфильтрованы в соответствии с полем упоминания , где каждый член упомянутого массива должен находиться в заданном входном массиве, если есть какие-либо несоответствия, тогда игнорируйте объект. Условия запрос или запрос с обязательным полем не решают нашу проблему.

1 Ответ

0 голосов
/ 20 января 2020

Очень простое c решение - использовать выражение регулярного выражения в запросе регулярного выражения :

Ниже приведен пример запроса:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must_not": [                    <---- Note this.
        {
          "regexp": {
            "mentions": "[^XYKL]"      <---- Note this. 
          }
        }
      ]
    }
  }
}

Квадратные скобки [...] означают совпадение с одним из присутствующих символов.

Я просто использовал Negate Character ^ внутри скобки и обернул Regex Logi c внутри must_not предложения Bool Query , и он должен дать вам что ты ищешь.

Запрос будет возвращать только документы со значениями X Y K L. Любые другие значения, кроме этого, не будут возвращать эти документы.

Обратите внимание, что я предполагаю, что поле mentions имеет тип keyword.

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