ElasticSearch сортировка по полю в NestedObject при первом указателе массива - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь отсортировать поле внутри первого объекта массива в следующих документах. У каждого документа есть массив. Я хочу получить документы, отсортированные по первым объектам по названию города. Позволяет назвать это в следующем результате.иметь первые третьи документы, потому что название города начинается с «L» («лондон»), затем второй «M» («Москва»), затем третий «N» («NYC»)

структура представляет собой запись, которая:

  1. имеет массив
  2. массив содержит объект (называемый 'адрес')
  3. объект имеет поле (называемое'city')

Я хочу отсортировать документы по первому address.cities

    get hello/_mapping 
    {
      "hello": {
        "mappings": {
          "jack": {
            "properties": {
              "houses": {
                "type": "nested",
                "properties": {
                  "address": {
                    "properties": {
                      "city": {
                        "type": "text",
                        "fields": {
                          "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

Это документ, который я проиндексировал

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "hello",
        "_type": "jack",
        "_id": "2",
        "_score": 1,
        "_source": {
          "houses": [
            {
              "address": {
                "city": "moscow"
              }
            },
            {
              "address": {
                "city": "belgrade"
              }
            },
            {
              "address": {
                "city": "Sacramento"
              }
            }
          ]
        }
      },
      {
        "_index": "hello",
        "_type": "jack",
        "_id": "1",
        "_score": 1,
        "_source": {
          "houses": [
            {
              "address": {
                "city": "NYC"
              }
            },
            {
              "address": {
                "city": "PARIS"
              }
            },
            {
              "address": {
                "city": "TLV"
              }
            }
          ]
        }
      },
      {
        "_index": "hello",
        "_type": "jack",
        "_id": "3",
        "_score": 1,
        "_source": {
          "houses": [
            {
              "address": {
                "city": "London"
              }
            }
          ]
        }
      }
    ]
  }
}

1 Ответ

0 голосов
/ 07 марта 2019

Попробуйте это (конечно, добавьте некоторый тест внутри скрипта, если поле может быть пустым. Обратите внимание, что оно может быть довольно медленным, потому что эластичный не будет индексировать это значение. Добавить поле основного адреса будет быстрее (и действительно быстрее) дляконечно, и это было бы хорошим способом сделать это.

{
      "sort" : {
        "_script" : {
            "script" : "params._source.houses[0].address.city",
            "type" : "string",
            "order" : "asc"
        }
    }
}

Вы должны использовать _source вместо doc [yourfield], потому что вы не знаете, в каком порядке хранить данные в вашем массиве.

РЕДАКТИРОВАТЬ: проверить, если поле существует

{
  "query": {
    "nested": {
      "path": "houses",
      "query": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "houses.address"
              }
            }
          ]
        }
      }
    }
  },
  "sort": {
    "_script": {
      "script" : "params._source.houses[0].address.city",
      "type": "string",
      "order": "asc"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...