Elasticsearch: проверьте существующий ключ в поле типа object - PullRequest
2 голосов
/ 18 марта 2020

Мой индекс test имеет следующее отображение:

{
  "test" : {
    "mappings" : {
      "_doc" : {
        "properties" : {
          "bar" : {
            "type" : "keyword"
          },
          "baz" : {
            "type" : "long"
          },
          "foo" : {
            "type" : "object",
            "enabled" : false
          }
        }
      }
    }
  }
}

Индекс имеет 2 документа:

{
  "total": 2,
  "max_score": 1.0,
  "hits": [
    {
      "_index": "test",
      "_type": "_doc",
      "_id": "1",
      "_score": 1.0,
      "_source": {
        "baz": 123,
        "bar": [
          "php",
          "python"
        ],
        "foo": {
          "1": "bla",
          "2": "blu"
        }
      }
    },
    {
      "_index": "test",
      "_type": "_doc",
      "_id": "2",
      "_score": 1.0,
      "_source": {
        "baz": 123,
        "bar": [
          "java",
          "python"
        ],
        "foo": {
          "3": "blue",
          "4": "blae"
        }
      }
    }
  ]
}

Я хочу получить только документы, содержащие ключ 1 в поле foo. (Так что в моем случае это документ, в котором _id = 1).

Какой запрос подходит для этого?

Elasticsearch версия 6.5

1 Ответ

2 голосов
/ 18 марта 2020

Вы установили "enabled": false в своем отображении. Установите его на true или, скорее, удалите его, который снова установит его на true по умолчанию.

Цель enabled, если она установлена ​​на true, состоит в том, что она позволит ES создать инвертированный индекс для полей, чтобы они были доступны для поиска. Установка false будет означать, что ES просто пропустит чтение этих полей и их содержимого полностью.

Обратите внимание, что по умолчанию, если вы не указываете это в своем отображении, оно установлено на true.

Ниже показано, как будет отображаться ваше отображение:

PUT <your_index_name>
{
    "mappings" : {
        "properties" : {
          "bar" : {
            "type" : "keyword"
          },
          "baz" : {
            "type" : "long"
          },
          "foo" : {
            "type" : "object",
            "enabled" : true       <---- Note this, either this or remove this to have this option
          }

      }
    }
}

Как только вы это сделаете, вы можете просто использовать существующий запрос, чтобы получить то, что вы хотите.

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "foo.1"
          }
        }
      ]
    }
  }
}

Предлагаемое решение:

Насколько я понимаю, исходя из комментариев, у вас есть ids документов как sub-fields внутри вашего object типа.

Почему бы не изменить отображение на что-то похожее на приведенное ниже:

POST my_sample_index
{
   "mappings":{
      "properties":{
         "bar":{
            "type":"keyword"
         },
         "baz":{
            "type":"long"
         },
         "foo":{
            "type":"object",
            "properties":{
               "id":{                       <--- Field for id
                  "type":"keyword"
               },
               "value":{                    <--- Corresponding field for its value
                  "type":"text"
               }
            }
         }
      }
   }
}

Таким образом, документ будет выглядеть так:

POST my_sample_index/_doc/1
{
   "baz":123,
   "bar":[
      "java",
      "python"
   ],
   "foo":[
      {
         "id":"1",
         "value":"blue"
      },
      {
         "id":2,
         "value":"black"
      }
   ]
}

Теперь вы можете просто запрашивать на основе значение поля id с таким простым значением, как Term Query :

POST my_exists_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "foo.id": "1"
          }
        }
      ]
    }
  }
}

Теперь вы можете видеть, что количество полей в вашем отображении будет только двумя id и value вместо того, чтобы создавать его динамически, особенно если число документов, которое у вас могло бы быть, было бы неопределенным c.

Важное примечание: Возможно, вы также захотите проверить тип данных nested вместо object. Также, если вы используете nested тип данных, вы должны использовать Nested Queries. Пожалуйста, прочитайте вышеупомянутые ссылки о том, почему я предлагаю вам go через них.

Надеюсь, это поможет!

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