Nano Hash - криптовалюты, майнинг, программирование

Сопоставьте все значения во вложенном массиве с помощью elasticsearch

Я пытаюсь использовать elasticsearch для сопоставления всех значений во вложенном массиве. Например. мой массив поиска равен ["1","2","3","4","5","6","7","8","9"], а мой документ содержит массив таких массивов, как

"arr":[
["1","2","10"],
["4","5"],
["8","9","11"]
]

Мне нужно сопоставить все значения внутри вложенного массива, но только один из вложенных массивов должен совпадать, чтобы документ совпадал. Итак, в этом примере только второй вложенный массив является совпадением, потому что "4" и "5" оба присутствуют в массиве поиска (поэтому мой документ является совпадением). Какой запрос я должен использовать для достижения этой цели?


Ответы:


1

Вы можете обойтись простым Groovy script вроде этого:

def match = false; 
for (sub_array in _source.arr) {
    match = match || (search_array.intersect(sub_array).size() == sub_array.size())
}
return match;

Идея состоит в том, чтобы перебрать все подмассивы arr и проверить, имеет ли пересечение с массивом поиска тот же размер, что и сам подмассив.

Обернув это внутри фильтра script, запрос будет выглядеть так:

POST index/type/_search
{
   "query": {
      "filtered": {
         "filter": {
            "script": {
               "script": "def match = false; for (sub_array in _source.arr) {match = match || (search_array.intersect(sub_array).size() == sub_array.size())}; return match;",
               "params": {
                  "search_array": [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
               }
            }
         }
      }
   }
}

Вам также необходимо включить динамические сценарии, чтобы это работало, то есть в вашем файле elasticsearch.yml просто добавьте script.inline: on и перезапустите кластер.

11.11.2015
  • Начиная с ES 6.1, terms_set запрос тоже может помочь. 18.01.2018
  • Теперь в более новых версиях elasticsearch вы не можете получить доступ к _source из сценариев фильтрации. Так что этот метод не сработает. 05.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..