Хобрук: Ваш путь к мастерству в программировании

Elasticsearch — в документе запроса отсутствует значение массива

Я хотел бы запросить свой индекс elasticsearch, чтобы получить документы, которые не содержат определенного значения в массиве. Например, если мой запрос:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match_all": {}
                }
            ],
            "must_not": [],
            "should": []
        }
    },
    "from": 0,
    "size": 10,
    "sort": [],
    "facets": {}
}

И набор данных:

{
    "took": 1,
    "hits": {
        "total": 1,
        "hits": [
            {
                "_index": "product__1434374235336",
                "_type": "product",
                "_id": "AU33Xeny0K4pKlL-a7sr",
                "_source": {
                    "interdictions": ["S0P","SK3"],
                    "code": "foo"
                }
            },
            {
                "_index": "product__1434374235336",
                "_type": "product",
                "_id": "AU33Xeny0K4pKlL-a7sr",
                "_source": {
                    "interdictions": ["S0P","S2V","SK3"],
                    "code": "bar"
                }
            }
        ]
    }
}

Цель состоит в том, чтобы исключить все продукты, содержащие запрет "S2V". Сначала я думал об использовании missing filter :

{
    "query": {
        "bool": {
            "must": [
                {
                    "match_all": {}
                }
            ],
            "must_not": [],
            "should": []
        }
    },
    "filter": {
        "missing": {
            "terms": {
                "interdictions": [
                    "S2V"
                ]
            }
        }
    },
    "from": 0,
    "size": 10,
    "sort": [],
    "facets": {}
}

Но elasticsearch не может проанализировать запрос: QueryParsingException[[product__1434374235336] [missing] filter does not support [interdictions]]; }]",. Затем я попытался с must_not :

{
    "query": {
        "bool": {
            "must": [
                {
                    "match_all": {}
                }
            ],
            "must_not" : {
                "terms" : {
                    "interdictions" : ["S2V"]
                }
            }
        }
    },
    "from": 0,
    "size": 10
}

Но вывод неверный, т.к. он возвращает продукт с S2V запретами.

Итак... Каков правильный способ сделать это?

Спасибо !

16.06.2015

  • Ответ от @Andrei Stefan имеет смысл. Кстати, вы можете использовать match вместо terms, поэтому анализатор будет применяться для S2V при запросе. Подробнее здесь (Why doesn’t the term query match my document?): elastic .co/guide/en/elasticsearch/reference/current/ 16.06.2015

Ответы:


1

Попробуйте это (со значением нижнего регистра для terms логического значения):

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "must_not": {
        "terms": {
          "interdictions": [
            "s2v"
          ]
        }
      }
    }
  },
  "from": 0,
  "size": 10
}

Скорее всего, у вас есть анализатор (может быть, standard по умолчанию), который переводит термины в нижний регистр, поэтому в индексе ES значение индексируется как s2v, sk3 и т. д. А terms не анализирует входное значение, он использует его как есть (в вашем случае с заглавными буквами), поэтому он никогда не совпадет.

16.06.2015
Новые материалы

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

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

Быстрая разработка: волшебный мир больших языковых моделей
РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..

Ускоренный курс по Node Redis
Сегодня мы будем учиться использовать Redis в Node.js, однако я не собираюсь вываливать сюда всю документацию и утомлять вас до смерти. Это руководство для начинающих? — спросите вы. Ну..

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

Принудительный сброс состояния компонента React с помощью ключевого свойства
Принудительный сброс состояния компонента React с помощью ключевого свойства Знаете ли вы, что вы можете использовать опору key для принудительного сброса состояния компонента? В..