gpt4 book ai didi

arrays - ElasticSearch按数组第一个索引处的NestedObject中的字段排序

转载 作者:行者123 更新时间:2023-12-02 23:15:57 25 4
gpt4 key购买 nike

我正在尝试在以下文档中对数组的第一个对象内的字段进行排序
每个文档都有一个数组,我想检索按其首个对象排序的文档,然后按城市名称让其命名。在以下结果中,我要首先获取第三个文档,因为城市名称以“L”开头(伦敦'),然后是第二个“M”(“莫斯科”),然后是第三个“N”(“NYC”)

该结构是以下记录:

  • 具有数组
  • 该数组包含一个对象(称为“地址”)
  • 对象具有一个字段(称为“城市”)

  • 我想按第一个地址对文档进行排序
        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"
    }
    }
    ]
    }
    }
    ]
    }
    }

    最佳答案

    尝试一下(当然,如果字段可以为空,请在脚本内添加一些测试。请注意,这可能会很慢,因为 flex 不会为该值建立索引。添加一个主地址字段肯定会更快(并且实际上会更快)。成为做到这一点的好方法。

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

    您必须使用_source而不是doc [yourfield],因为您不知道按顺序 flex 存储数组。

    编辑:测试字段是否存在
    {
    "query": {
    "nested": {
    "path": "houses",
    "query": {
    "bool": {
    "must": [
    {
    "exists": {
    "field": "houses.address"
    }
    }
    ]
    }
    }
    }
    },
    "sort": {
    "_script": {
    "script" : "params._source.houses[0].address.city",
    "type": "string",
    "order": "asc"
    }
    }
    }

    关于arrays - ElasticSearch按数组第一个索引处的NestedObject中的字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55045840/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com