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

时间:2019-03-07 14:12:23

标签: arrays sorting elasticsearch nested

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

该结构是一个记录,该记录:

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

我想按第一个地址对文档进行排序。城市

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select>
  <option class="lorem">1</option>
  <option class="lorem">2</option>
</select>

这就是我索引的文档

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

1 个答案:

答案 0 :(得分:0)

尝试一下(当然,如果字段可以为空,请在脚本中添加一些测试。请注意,这可能会非常慢,因为弹性不会为该值编制索引。添加主地址字段会更快(实际上更快))肯定并且是这样做的好方法。

{
      "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"
    }
  }
}