本文章总结自己在使用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调用方式:暂时未研究