django-elasticsearch-dsl-drf с JSONField

#json #django #elasticsearch #elasticsearch-dsl

#json #джанго #эластичный поиск #elasticsearch-dsl

Вопрос:

Я использую пакет django-elasticsearch-dsl-drf, и у меня есть Postgres JSONField, который я хочу проиндексировать. Я попытался использовать Nestedfield в документе, но без каких-либо свойств, поскольку поле json является произвольным, но я не могу выполнить поиск по этому полю, и я не вижу ничего, связанного с этим, в их документации.

Есть какие-нибудь идеи, как я могу этого добиться?

Отображение:

     {
  "mappings": {
    "_doc": {
      "properties": {
        "jsondata": {
          "type": "nested",
          "properties": {
            "timestamp": {
              "type": "date"
            },
          "gender": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "group_id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }, ...
 

Я хочу выполнить поиск по этому полю, например, jsondata.gender = x

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

1. Вложенные поля должны использоваться для массива объекта. Также запрос вложенных объектов в Elasticsearch немного отличается. Пожалуйста, посмотрите на: elastic.co/guide/en/elasticsearch/reference/current/nested.html . Поскольку поле json является произвольным, было бы неплохо, если бы можно было попробовать с типом объекта.

2. Я пробовал оба, и это правильно отображалось. но как я могу выполнить поиск по этому полю внутри viewset? «как в их документе»

3. Было бы неплохо, если бы вы могли поделиться картированием и некоторыми примерами данных.

4. вопрос обновлен. Как и в их документе, у них есть «фильтр вложенных полей», но они знают ключи, которые они хотят искать в нем. в моем случае я этого не знаю. мы ценим вашу помощь!

5. был ли запрос полезным?

Ответ №1:

Запрос для jsonfield.gender = x

 GET <index>/_search
{
  "query": {
    "nested": {
      "path": "jsonfield",
      "query": {
        "term": {
          "jsonfield.gender.keyword": {
            "value": "x"
          }
        }
      }
    }
  }
}
 

ПРИМЕЧАНИЕ: Запрос не был проверен с помощью инструментов разработчика Kibana.