本文章總結自己在使用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調用方式:暫時未研究