Поиск ElasticSearch по пустым полям

#elasticsearch

#elasticsearch

Вопрос:

Я добавил новое поле вложенного объекта в индекс эластичного поиска. Я хочу обновить поле некоторым значением по умолчанию, например [ {«ключ»: «xyz», «значение»: «val1»}] . Я пытаюсь запросить индекс, в котором значение поля пустое или нулевое, но безуспешно.

Я пробовал это

 "bool": {
  "must_not": {
    "exists": {
      "field": "PropertyFields"
    }
  }
}
 

пример данных

 [
  {
    "Id": 1,
    "subjectPropertyFields": [
      {
        "value": "xyz",
        "key": "zzz"
      }
    ]
  },
  {
    "Id": 2
  },
  {
    "Id": 3
  }
]
 

Я хочу запросить идентификаторы 2,3.

Комментарии:

1. не могли бы вы поделиться некоторыми образцами данных индекса и ожидаемым результатом поиска?

2. пример данных, я хочу запросить идентификаторы 2 и 3 [ { «Id»: 1, «subjectPropertyFields»: [ { «value»: «xyz», «key»: «zzz» } ] }, { «Id»: 2 }, { «Id»: 3 }]

Ответ №1:

Если вы хотите найти документы, в которых отсутствует поле вложенного объекта, вы можете использовать must_not логический запрос с запросом exists .

Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска

Сопоставление индексов:

   {
  "mappings": {
    "properties": {
      "subjectPropertyFields": {
        "type": "nested"
      }
    }
  }
}
 

Индексировать данные:

 {
    "Id": 1,
    "subjectPropertyFields": [
      {
        "value": "xyz",
        "key": "zzz"
      }
    ]
  }
  {
    "Id": 2
  }
  {
    "Id": 3
  }
 

Поисковый запрос:

  {
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "subjectPropertyFields",
            "query": {
              "bool": {
                "filter": {
                  "exists": {
                    "field": "subjectPropertyFields"
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "65047473",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.0,
        "_source": {
          "Id": 2
        }
      },
      {
        "_index": "65047473",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.0,
        "_source": {
          "Id": 3
        }
      }
    ]
 

Комментарии:

1. @Ajay Kumar пожалуйста, ознакомьтесь с моим ответом и дайте мне знать, решит ли это вашу проблему?

2. @Ajay Kumar спасибо, что приняли ответ, не могли бы вы также проголосовать за ответ 🙂

3. спасибо, можете ли вы помочь мне с запросом, если мне нужно добавить дополнительный запрос типа isdata = true и существующую логику запроса для него.

4. @AjayKumar вы можете использовать комбинацию bool query (с предложением match) для того же, и было бы лучше, если бы вы могли задать отдельный вопрос для того же самого с вашими новыми требованиями 🙂

5. @AjayKumar существует ли в вашем документе поле с именем isdata ?