按嵌套对象计数的弹性搜索顺序

vin*_*vin 2 search elasticsearch tire

初学者使用Elasticsearch.我觉得这应该很简单,但我被困在这里.我有一个Posts的映射,看起来像这样:

[ post1: {
   title: 'asdfasd',
   comments: [commment1, comment2, comment3]
},
post2: {
   title: 'asdf',
   comments: [comment1, comment2]
}
.
.
.]
Run Code Online (Sandbox Code Playgroud)

我正在尝试按标题搜索它们,然后按评论数量排序.我可以通过标题搜索就好了,但是我对如何通过评论计数来排序结果感到有点困惑.这样做最好的方法是什么?

Rot*_*mon 13

你有两个选择 -

  1. 使用脚本获取数组的长度.所以你会做类似的事情:

    {  
      "query" : {  
        ....  
      },  
      "sort" : {  
        "_script" : {  
          "script" : "doc['comments'].values.length",  
          "type" : "number",  
          "order" : "desc"  
        }  
      }  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为注释数量保留一个附加字段,每次添加注释时也会增加注释计数器的值,并按其排序.

如果你有大量数据,最好选择#2.使用脚本会产生开销,如果必须在大量文档上计算脚本,则可能会增加搜索时间.另一方面,按字段排序在性能方面要好得多.我会选择#2.