Поиск массива объектов в Elasticsearch - PullRequest
0 голосов
/ 09 июля 2019

Я храню ответы на опросы в своей ES, так что получается, что люди используют мобильное приложение для заполнения форм опроса, эти ответы отправляются на сервер, а затем сохраняются в ES следующим образом, вот как ответы на вопросыв форме хранятся

answers {
  "uKeCywV4SAgD8YGReSkn" : {
              "_id" : "b465de5e-5468-40fe-8a8d-fc02083",
              "responseVersionNumber" : 1,
              "options" : [
                {
                  "id" : "32700fb5-51d2-4617-b65f-831b83c88080"
                },
                {
                  "id" : "32700fb5-51d2-4617-b65f-831b83c87777"
                }
}

документ answers содержит ответы на каждый вопрос под своим идентификатором вопроса.Строка, которую вы видите ниже, является идентификатором вопроса, так же как все остальные ответы хранятся в ES под соответствующими идентификаторами вопросов в соответствующих документах для этого ответа.

Теперь я хочу выполнить поиск по этимответы, приведенный выше ответный ответ имеет тип mcq multi-select, так как вы можете видеть текстовое поле (которое содержит) значения ответа (то есть хобби пользователя Gardening и Sports) и массив опций id, оба могут использоваться для этого,Я могу отправить массив идентификаторов опций из моего веб-приложения в ES или текстовые значения (или метки опций, как мы их называем), а также использовать идентификаторы вопросов, например, скажем, у меня есть вопрос с идентификатором q1, поэтому я хочу запросчтобы сказать, что дайте мне документы, где вопрос q1 имеет оба ответа a1 и a2

Я давно хотел исследовать подход опций id, это пример запроса, который я строю для него.

 {
    "_source": {"includes": ["answers.uKeCywV4SAgD8YGReSkn.text", "answers.uKeCywV4SAgD8YGReSkn.questionTypeCode"]},
    "query": {
        "bool": {
            "filter": [{
                "bool": {
                    "must": [{
                        "match": {
                            "answers.uKeCywV4SAgD8YGReSkn.options.id": "32700fb5-51d2-4617-b65f-831b83c88080"
                        }
                    },
                        {
                        "match": {
                            "answers.uKeCywV4SAgD8YGReSkn.options.id": "32700fb5-51d2-4617-b65f-831b83c87777"
                        }
                    }
                    ]
                }
            }, {
                "match": {
                    "formId": "hHhcLKh9st1vFr8nDY4a"
                }
            }, {
                "range": {
                    "_updated_at": {
                        "from": "1970-01-01T00:00:00.000+0000",
                        "include_lower": true,
                        "include_upper": true,
                        "to": null
                    }
                }
            }]
        }
    }
 }

Я хотел бы знать, есть ли какие-либо недостатки для использования этого подхода вместо поиска в поле text с использованием boметки опций

В соответствии с отображением, так установлены оба поля

"questionId": {
   "type": "keyword",
   "index": false
},

"text": {
    "type": "text"
},

"options": {
    "enabled": false
},

1 Ответ

1 голос
/ 09 июля 2019

Ваш вопрос был немного сложен для понимания ... но для меня это может быть слишком рано утром :) Я не совсем понимаю, что поле "идентификаторы опций" должно здесь делать.Ваш ответ используется для нескольких вопросов?Или у вашего ответа есть несколько вариантов?Если это так, почему пользователь также может ответить с текстом?Кроме того, зачем помещать все поля на два уровня вглубь документа?Почему бы просто не хранить их в квартире?Кажется, что имя поля может быть проблематичным.

Хотя я не совсем уверен, что вы спрашиваете здесь, я могу предложить некоторые вещи, которые, вероятно, помогут.

I 'Недавно мы поиграли с Elasticsearch, особенно с массивами вложенных объектов.То, что вы можете искать, это вложенный тип данных.Я настоятельно рекомендую вам прочитать документацию .

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

Сначала вам нужно указать свое сопоставление, чтобы сообщить Elasticsearch, что «options» является вложенным типом данных:

PUT INDEX_NAME
{
  "mappings": {
    "DOCUMENT_TYPE": {
      "properties": {
        "options": {"type": "nested"}
      }
    }
  }
}

Затем, послеВы индексируете свои документы, вы можете использовать вложенный запрос для запроса поля.Например, если вы хотите получить ответы на все вопросы для идентификатора опции "ID_123":

GET INDEX_NAME/_search
{
  "query": {
    "nested": {
      "path": "options",
      "query": {
        "match": {
          "options.id.keyword": "ID_123"
        }
      }
    }
  }
}

Вы также можете "bool" вложенный запрос, чтобы добавить дополнительные параметры, например, если вы хотите, чтобы каждый ответ для идентификатора опции, который также был обновлен в прошедший день.

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

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