Агрегирование на вложенном поле - PullRequest
0 голосов
/ 14 октября 2019

1. У меня есть гибкая схема поиска ниже.

{
  "mappings": {
    "properties": {
      "process_id": {
        "type": "keyword"
      },
      "user_info": {
        "type": "nested",
        "properties": {
          "first_name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "last_name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "place": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

2. Я добавил следующие документы в указатель.

POST processes/_bulk 
  {"index":{"_id":1}}
{"process_id": "123", "user_info": [{"first_name": "A", "last_name": "B","place":"London"},{"first_name": "C", "last_name": "D","place":"Moscow"}]}
{"index":{"_id":2}}
{"process_id": "123", "user_info": [{"first_name": "C", "last_name": "B","Place":"Delhi"},{"first_name": "A", "last_name": "D","Place":"Bangalore"}]}

3. Я хотел найти process_id как 123, first_name как A и last_name как B, а также агрегировать на месте user_info. Я пытаюсь сделать это, как показано ниже.

{   "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "process_id:123"
          }
        },
        {
          "nested": {
            "path": "user_info",
            "query": {
              "query_string": {
                "query": "user_info.first_name:A AND user_info.last_name:B"
              }
            }
          }
        }
      ]
    }   },   "aggs": {
    "user_info": {
      "nested": {
        "path": "user_info"
      },
      "aggs": {
        "user_info.place": {
          "terms": {
            "field": "user_info.place"
          }
        }
      }
    }   } }

Результат возвращает первый документ правильно. Тем не менее, совокупность на местах возвращается и в Лондон, и в Москву. Однако я хочу, чтобы Лондон был возвращен как выходной. Я не уверен, как поступить с этим. Я также пробовал объединение поиска по вложенным фильтрам, но безуспешно.

1 Ответ

0 голосов
/ 14 октября 2019

Агрегация применяется ко всему документу, а не только к nested types, следовательно, вы видите оба places. Тем не менее, для вашего случая, поскольку вы хотите знать, какой вложенный документ соответствует - вы можете использовать Внутренние попадания

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "process_id:123"
          }
        },
        {
          "nested": {
            "path": "user_info",
            "query": {
              "query_string": {
                "query": "user_info.first_name:A AND user_info.last_name:B"
              }
            },
            "inner_hits": {}
          }
        }
      ]
    }
  }
}

Выше запрос должен дать вам внутренние совпадения, как показано ниже:

 "_source" : {
          "process_id" : "123",
          "user_info" : [
            {
              "first_name" : "A",
              "last_name" : "B",
              "place" : "London"
            },
            {
              "first_name" : "C",
              "last_name" : "D",
              "place" : "Moscow"
            }
          ]
        },
        "inner_hits" : {
          "user_info" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : 1.3862944,
              "hits" : [
                {
                  "_index" : "t1",
                  "_type" : "_doc",
                  "_id" : "1",
                  "_nested" : {
                    "field" : "user_info",
                    "offset" : 0
                  },
                  "_score" : 1.3862944,
                  "_source" : {
                    "first_name" : "A",
                    "last_name" : "B",
                    "place" : "London"
                  }
                }
              ]
            }
          }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...