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(new ScoreSortBuilder()).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调用方式:暂时未研究


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM