Примените более одного фильтра в упругом поиске вложенного объекта - PullRequest
0 голосов
/ 10 мая 2019

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

Данные в упругом поиске

D1 document
"fields":[
{
    "field_name": "test",
    "field_value": "test",
    "field_id": "123"
},
{
    "field_name": "test1",
    "field_value": "test1",
    "field_id": "1231"
},
{
    "field_name": "test2",
    "field_value": "test2",
    "field_id": "1232"
}]

D2 document
"fields":[
{
    "field_name": "test1",
    "field_value": "testda",
    "field_id": "123a"
},
{
    "field_name": "test1ad",
    "field_value": "test1",
    "field_id": "1231"
},
{
    "field_name": "test2a",
    "field_value": "test2a",
    "field_id": "1231"
}]

Поля - это вложенный объект с отображением текста и ключевых слов

"fields": {
            "type": "nested",
            "properties": {
              "field_id": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              },
              "field_name": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              },
              "field_value": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              }
            }
          }

Это мой эластичный поисковый запрос

GET myindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "nested":{
          "path":"fields",
          "query":{
            "bool":{
              "must":{
                "bool":{
                  "must":[{
                    "match":{
                      "field_id.raw": "1231"
                    }
                  },
                  {
                    "match":{
                      "field_value.raw": "test1"
                    }
                  },
                  {
                    "match":{
                      "field_name.raw": "test1"
                    }
                  }]
                }
              }
            }
          }
        }
      }
    }
  }
}

Я не получаю никакого ответа.И я хочу, чтобы возвращался только первый документ, поскольку он имеет соответствие в том же объекте, а не в документе 2, который также имеет соответствие, которое есть здесь и там.Заранее спасибо ...

1 Ответ

0 голосов
/ 10 мая 2019

Вы должны использовать полное имя в случае вложенных полей. Поэтому вместо field_id.raw это должно быть fields.field_id.raw. То же самое относится и к другим полям.

Итак, ваш запрос должен быть:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "fields.field_id.raw": "1231"
                    }
                  },
                  {
                    "match": {
                      "fields.field_value.raw": "test1"
                    }
                  },
                  {
                    "match": {
                      "fields.field_name.raw": "test1"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...