Как проверить вasticsearch, если у объекта JSON есть ключ, использующий DSL? - PullRequest
0 голосов
/ 23 ноября 2018

Если у меня есть два документа в индексе следующего формата, я просто хочу отсеять те, которые имеют пустой JSON вместо моего ожидаемого ключа.

A

{ 
  "search": { 
      "gold": [1,2,3,4]
}

B

{
  "search":{}
}

Я просто должен получить A json, а не B json.

Я пробовал существующий запрос для поиска "gold", но он просто проверяет ненулевые значения ивозвращает список.Примечание: следующее не делает то, что я хочу.

GET test/_search
{
  "query": {
    "bool": {
    "must": [
        { 
           "exists": { "field": "search.gold" }}
       ]
     }
   }
}

Это простой вопрос, но я не могу найти способ сделать это даже после поиска в их документах.Если кто-то может помочь мне сделать это, это было бы действительно здорово.

Упрощенное отображение индекса:

"test": {
    "mappings": {
    "carts": {
        "dynamic": "true",
        "_all": {
        "enabled": false
        },
        "properties": {
        "line_items": {
            "properties": {
            "line_items_dyn_arr": {
                "type": "nested",
                "properties": {
                "dynamic_key": {
                    "type": "keyword"
                }
                }
            }
            }
        }
        }
    }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Ответ Нишанта правильный, но по какой-то причине я мог заставить его работать, только если путь и поле - это целые пути.

Следующее работает для меня.

{
    "nested": {
        "path": "search.gold",
        "query": {
        "exists": {
            "field": "search.gold"
        }
        }
    }
}
0 голосов
/ 23 ноября 2018

Вы сохраняете полный JSON в поле search ?Если это не так, пожалуйста, поделитесь отображением вашего индекса и примера данных.

Обновление: Запрос для вложенного поля:

{
  "query": {
    "nested": {
      "path": "search",
      "query": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "search.gold"
              }
            }
          ]
        }
      }
    }
  }
}

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

Эластичная документация: Вложенный запрос

ОБНОВЛЕНИЕ на основе добавленного сопоставления в вопросе:

{
  "query": {
    "nested": {
      "path": "line_items.line_items_dyn_arr",
      "query": {
        "exists": {
          "field": "line_items.line_items_dyn_arr"
        }
      }
    }
  }
}

Обратите внимание, что мы использовали "path": "line_items.line_items_dyn_arr".Причина, по которой мы требуем предоставить полный путь, заключается в том, что nested поле line_items_dyn_arr само находится под объектом line_items.Если бы line_items_dyn_arr было свойством отображения, а не свойством поля object или nested, предыдущий запрос работал бы нормально.

...