Поиск по нескольким полям во вложенном документе, разделенных предложением or вasticsearch - PullRequest
0 голосов
/ 17 декабря 2018

Название вопроса не полностью оправдывает то, что мне нужно.У меня есть вложенный документ в форме

{
    "tags": [
        {
            "context": "context_pic_elements",
            "name": "walls",
            "created_at": 1542806972000,
            "tag_id": 48,
            "tagging_id": 1225
        },
        {
            "context": "element",
            "name": "solo",
            "created_at": 1542806972000,
            "tag_id": 47,
            "tagging_id": 1226
        },
        {
            "context": "end_use",
            "name": "home renovation",
            "created_at": 1542806972000,
            "tag_id": 45,
            "tagging_id": 1224
        }
    ],
    "name": "Wall patterns",
}

Документ сопоставлен с

{
  "properties": {
    "name": {
      "type": "text"
    },
    "tags": {
      "type": "nested",
      "properties": {
        "name": { "type": "keyword" },
        "context": { "type": "keyword" },
        "tag_id": { "type": "integer" }
      }
    }
  }
}

Я хочу иметь возможность запросить изображение в виде

images WHERE
    (tags.context="context_pic_elements" AND tags.name="walls")
    OR (tags.context="element" AND tags.name="solo")

Я сейчас пытаюсь выполнить запрос

{
  "query": {
    "nested" : {
      "path" : "tags",
      "query": {
        "bool": {
          "should" : {
            "bool": {
              "must": [
                {"term": {"tags.context": "context_pic_elements"}},
                {"term": {"tags.name": "walls"}}
              ]
            }
          }
        }
      }
    }
  }
}

Это позволяет мне запросить первое условие предложения AND.Куда я добавляю второе условие AND (эластичный поиск не позволяет более одного условия в своем запросе) в запросе, чтобы я мог выполнить запрос по обоим условиям.Я посмотрел на зеркальный комбинатasticsearch bool must с OR , но это не то, что мне нужно.

1 Ответ

0 голосов
/ 17 декабря 2018

Поскольку вложенные документы являются отдельными документами, вам нужно сделать это наоборот, т.е. ИЛИ два вложенных предложения вместо того, чтобы вкладывать два предложения ИЛИ, это выглядит так:

POST index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "context_pic_elements"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "walls"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "element"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "solo"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...