600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > es 吗 查询必须有sort_elasticsearch使用小结(ES使用小结)

es 吗 查询必须有sort_elasticsearch使用小结(ES使用小结)

时间:2020-02-10 15:56:29

相关推荐

es 吗 查询必须有sort_elasticsearch使用小结(ES使用小结)

本文章总结自己在使用es过程中遇到的一些场景与解决办法。

1.查询结果排序

使用es进程query时,默认是按照_score排序的,当score同分时,同分结果顺序就不确定了(可能是按更新时间排序),如果要进行二次排序,就要用到sort功能了,话不多说,上代码:

POST /templatename/_search

{

"from" : 0,

"size" : 50,

"query": {

"match": {

"question" :"你说我的社保怎么交好呢?"}

},

"track_scores": true,

"sort": [

"_score",

{ "idx" : {"order" : "desc","unmapped_type" : "long"}}

]

}

这里score元素携带了排序信息,分别按_score和source中的idx元素排序,可以指定正序或逆序。unmapped_type不设置时,如果source中不包含idx元素,查询会返回错误信息,包含时,可以使用默认值填充,正序使用最大值,逆序使用最小值等。

使用了score元素默认不会计算最高分,携带track_scores元素可以继续计算最高分,一般没有这个必要。

下面看javaAPI的使用方式:

SearchRequestBuilder requestBuilder = this.getClient().prepareSearch(alias).setTypes(type);

MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("question", question);//在评分排序基础上进行id的升序排序,使粗排分数相同的项顺序相同,unmappedType可以理解为,如果不存在改字段,则识别为long的最大(最小)值,位置在最后,避免直接返回不存在错误

FieldSortBuilder idSort = SortBuilders.fieldSort("idx").order(SortOrder.ASC).unmappedType("long");

SearchResponse response= requestBuilder.setQuery(queryBuilder).setFrom(0).setSize(50).addSort(newScoreSortBuilder()).addSort(idSort).get();

这里要注意的是score排序和source元素排序是有区别的,_score排序使用ScoreSortBuilder才能识别为es的"_score",否则会认为是source元素,source元素排序参数使用SortBuilders构造

2.查询index时指定列返回

按照官方参考文档,我门很容易知道“GET _cat/indices?v”可以返回所有索引的列表和其基本信息,但这只是“基本信息”,如果想要获取更多信息则需要定制“信息列”。

可以使用“GET _cat/indices?help”查看支持的列信息以及其对应简写、说明,然后使用h=col1,col2的形式定制

如下,定制了h(current health status)、i(index name)、cd(index creation date (millisecond value))、cds(index creation date (as string))4个列.

GET _cat/indices?h=h,i,cd,cds

javaAPI调用方式:暂时未研究

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。