Как искать отдельные поля ключа и значения в массиве в ElasticSearch? - PullRequest
0 голосов
/ 29 июня 2018

Мои документы ElasticSearch содержат вложенную коллекцию полей формы. Каждое поле имеет имя и значение, и отображение выглядит следующим образом:

form: {
  properties: {
    id:         { type: 'integer' },
    name:       { type: 'text' },
    form_data:  {
      type: 'nested',
      properties: {
        'name':  { type: 'keyword' },
        'value': { type: 'text', analyzer: 'full_text_analyzer' }
      }
    }
  }
}

Мне нужно разрешить пользователю выполнять поиск по нескольким полям формы для уточнения поиска. Они могут выбрать, по каким полям искать, и присвоить значение каждому из них. Например

applicant_name = 'Joe'
pet_type = 'dog'

При этом будут найдены все документы, которые содержат поле с именем applicant_name, имеющее нечеткое совпадение значений Joe, а также поле с именем pet_type и нечеткое совпадение значений dog.

Запрос, с которым я пытаюсь это сделать, выглядит следующим образом .:

{
  "query": {
    "bool": {
      "must": [{
        "nested": {
          "path": "form_data",
          "query": {
            "filter": {
              "bool": {
                "must": [
                  {
                    "bool": {
                      "must": [
                        { "term": { "form_data.name": "applicant_name" } },
                        { "match": { "form_data.value": "Joe" } }
                      ]
                    }
                  },
                  {
                    "bool": {
                      "must": [
                        { "term": { "form_data.name": "pet_type" } },
                        { "match": { "form_data.value": "dog" } }
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      }]
    }
  }
}

Однако я получаю 0 результатов.

1 Ответ

0 голосов
/ 29 июня 2018

Попробуйте использовать вложенный запрос для каждого условия в первоначальном предложении "must":

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "form_data",
            "query": {
              "bool": {
                "must": [
                  { "term": { "form_data.name": "applicant_name" } },
                  { "match": { "form_data.value": "Joe" } }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "form_data",
            "query": {
              "bool": {
                "must": [
                  { "term": { "form_data.name": "pet_type" } },
                  { "match": { "form_data.value": "dog" } }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...