Фильтр ElasticSearch по вложенным полям логического типа - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно запросить несколько вложенных полей логических типов. Структура сопоставления:

    "mappings" : {
      "properties" : {
        "leaders" : {
          "type" : "nested",
          "properties" : {
            "except_1" : {
              "type" : "boolean"
            },
            "except_2" : {
              "type" : "boolean"
            },
            "counter" : {
              "type" : "integer"
            }
          }
        }
      }
    }

Я пытаюсь использовать запросы как except1, так и except2 только для False. Ниже моей попытки, к сожалению, он возвращает True и False для обоих полей, и я не могу это исправить.

    "query": {
        "nested": {
            "path": "leaders",
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "leaders.except_1": False
                            }
                        },
                        {
                            "term": {
                                "leaders.except_2": False
                            }
                        }
                    ]
                }
            }
        }
    }

1 Ответ

2 голосов
/ 07 мая 2020

Вероятно, вы ищете вариант inner_hits, показывающий только совпавшие вложенные вложенные документы.

PUT leaders
{"mappings":{"properties":{"leaders":{"type":"nested","properties":{"except_1":{"type":"boolean"},"except_2":{"type":"boolean"},"counter":{"type":"integer"}}}}}}

POST leaders/_doc
{
  "leaders": [
    {
      "except_1": true,
      "except_2": false
    },
    {
      "except_1": false,
      "except_2": false
    }
  ]
}

GET leaders/_search
{
  "query": {
    "nested": {
      "path": "leaders",
      "inner_hits": {}, 
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "leaders.except_1": false
              }
            },
            {
              "term": {
                "leaders.except_2": false
              }
            }
          ]
        }
      }
    }
  }
}

затем

GET leaders/_search
{
  "query": {
    "nested": {
      "path": "leaders",
      "inner_hits": {}, 
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "leaders.except_1": false
              }
            },
            {
              "term": {
                "leaders.except_2": false
              }
            }
          ]
        }
      }
    }
  }
}

с получением

{
  "hits":[
    {
      "_index":"leaders",
      "_type":"_doc",
      "_id":"u-he8HEBG_KW3EFn-gMz",
      "_score":0.87546873,
      "_source":{                           <-- default behavior
        "leaders":[
          {
            "except_1":true,
            "except_2":false
          },
          {
            "except_1":false,
            "except_2":false
          }
        ]
      },
      "inner_hits":{
        "leaders":{
          "hits":{
            "total":{
              "value":1,
              "relation":"eq"
            },
            "max_score":0.87546873,
            "hits":[                              <------- only the matching nested subdocument
              {
                "_index":"leaders",
                "_type":"_doc",
                "_id":"u-he8HEBG_KW3EFn-gMz",
                "_nested":{
                  "field":"leaders",
                  "offset":1
                },
                "_score":0.87546873,
                "_source":{
                  "except_1":false,
                  "except_2":false
                }
              }
            ]
          }
        }
      }
    }
  ]
}

Кроме того, вы можете заставить систему возвращать только inner_hits, произнеся "_source": "inner_hits" на верхнем уровне вашего поискового запроса.

...