栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Elasticsearch嵌套排序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Elasticsearch嵌套排序

嵌套文档不会保存为简单数组或列表。它们由Elasticsearch内部管理:

Elasticsearch从本质上来说仍然是平坦的,但是它在内部管理嵌套关系以使嵌套层次结构看起来更加美观。创建嵌套文档时,Elasticsearch实际上会索引两个单独的文档(根对象和嵌套对象),然后在内部将两者关联。(更多在这里)

我认为您需要向elasticsearch提供一些其他信息,以指示哪个作者是“主要/第一”作者。只需将这个附加字段放在嵌套对象中的一个作者中就足够了(您的映射可以像以前一样保持不变),如下所示:

{    "authorList" : [      {"lastName":"roger", "firstName":"christina", "authorOrder": 1},      {"lastName":"freud", "firstName":"damian"}    ]},{    "authorList" : [      {"lastName":"hawking", "firstName":"stephan", "authorOrder": 1},      {"lastName":"adams", "firstName": "mark" }      {"lastName":"frey", "firstName":"richard"}    ]},{    "authorList" : [      {"lastName":"adams", "firstName":"monica", "authorOrder": 1},      {"lastName":"adams", "firstName":"richard"}    ]}

然后查询可能是:

{  "query" : {    "nested" : {      "query" : {        "bool" : {          "must" : [ {   "match" : {     "authorList.authorOrder" : 1   } }          ]        }      },      "path" : "authorList"    }  },  "sort" : [    {      "authorList.lastName" : {        "order" : "asc",        "nested_filter" : {          "bool" : { "must" : [   {     "match" : {       "authorList.authorOrder" : 1     }   } ]          }        },        "nested_path" : "authorList"      }    }  ]}

并使用Java API:

QueryBuilder matchFirst = QueryBuilders.boolQuery()        .must(QueryBuilders.matchQuery("authorList.authorOrder", 1));QueryBuilder mainQuery = QueryBuilders.nestedQuery("authorList", matchFirst, ScoreMode.None);SortBuilder sb = SortBuilders.fieldSort("authorList.lastName")    .order(SortOrder.ASC)    .setNestedPath("authorList")    .setNestedFilter(matchFirst);SearchRequestBuilder builder = client.prepareSearch("test")        .setSize(50)        .setQuery(mainQuery)        .addSort(sb);

请注意,

SortBuilder
has
.setNestedFilter(matchAll)
表示
排序基于
authorList.lastName
字段,但仅基于您的“主要/第一”嵌套元素
。如果没有它,elasticsearch将首先对所有嵌套文档进行排序,从升序的排序列表中选择第一个元素,并根据此元素对父文档进行排序。因此带有“
Hawking”的文档可能是第一个,因为它的姓氏是“ Adams”。

最终结果是:

"authorList" : [      {"lastName":"adams", "firstName":"monica", "authorOrder": 1},      {"lastName":"adams", "firstName":"richard"}    ],}"authorList" : [      {"lastName":"hawking", "firstName":"stephan", "authorOrder": 1},      {"lastName":"adams", "firstName":"mark"},      {"lastName":"frey", "firstName":"richard"}    ]},{    "authorList" : [      {"lastName":"roger", "firstName":"christina", "authorOrder": 1},      {"lastName":"freud", "firstName":"damian"}    ]}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号