Elasticsearch-script 脚本排序

1.script 脚本排序
  • DSL语法
示例:
{
	"explain": true,
	"query": {
		"wildcard": {
			"name": {
				"wildcard": "*表*",
				"boost": 1
			}
		}
	},
	"sort": {
      "_script": {
         "script": "doc['sortCode'].value.length()",
         "type": "number",
         "order": "asc"
      }
   }
}
{
  "from" : 0,
  "size" : 5,
  "query" : {
    "bool" : {
      "filter" : {
        "terms" : {
          "id" : [ "33009", "30025", "20281", "16221", "103859", "102738" ]
        }
      }
    }
  },
  "sort" : [ {
    "_script" : {
      "script" : {
        "inline" : "def boolean bo1 = false;def boolean bo2 = false;def zhenghoumc = doc['binganList.zhenghoumc.raw'];def yongyao=doc['binganList.zhenciList.zhongyaozlList.zhongyaozcList.danweiymc.raw'];for(i in 0..<yongyao.size()){if(yongyao[i]!=''){bo1=true;break}};for(i in 0..<zhenghoumc.size()){if(zhenghoumc[i]!=''){bo2=true;break}};bo2==false&&bo1==false?0:(bo2==false&&bo1==true?1:(bo1==true&&bo2==true?10:9))"
      },
      "type" : "number",
      "order" : "desc"
    }
  } ]
}
  • Java api:
boolQuery.filter(QueryBuilders.termsQuery("id", list));
        SearchRequestBuilder builder = this.client.prepareSearch("cmhealth1");
        builder.setTypes("docase");
        builder.setQuery(boolQuery);
//        SortBuilder aa = SortBuilders.fieldSort("yongyao").;
//        Script aa = new ScriptSortBuilder("''==doc['source'].value?0:1","number").order(SortOrder.ASC);
        
        Script script=new Script("def boolean bo1 = false;def boolean bo2 = false;"
                + "def zhenghoumc = doc['binganList.zhenghoumc.raw'];"
                + "def yongyao=doc['binganList.zhenciList.zhongyaozlList.zhongyaozcList.danweiymc.raw'];"
                + "for(i in 0..<yongyao.size()){if(yongyao[i]!=''){bo1=true;break}};"
                + "for(i in 0..<zhenghoumc.size()){if(zhenghoumc[i]!=''){bo2=true;break}};"
                + "bo2==false&&bo1==false?0:(bo2==false&&bo1==true?1:(bo1==true&&bo2==true?10:9))");
        ScriptSortBuilder scriptSortBuilder = SortBuilders.scriptSort(script, "number").order(SortOrder.DESC);
//        builder.addSort("binganList.zhenghoumc", SortOrder.DESC);
        builder.addSort(scriptSortBuilder);
        builder.setFrom(pageNum);
        builder.setSize(pageSize);
        SearchResponse response = builder.get();
2.elasticsearch解决某一字段值等于某字符串时优先排序问题,这个很让我困扰,数据库中source字段为qyer时排在前面,对,就是这样用script完成这个排序
public Map<String, Object> findByQuestion(String content,int page){
		Map<String, Object> results=new HashMap<>();
		MatchQueryBuilder matchQueryBuilder=new MatchQueryBuilder("contents", content);
		matchQueryBuilder.analyzer("ik");
		TermQueryBuilder termQueryType=new TermQueryBuilder("type", "question");
		Page<QA> questionQa=qaRepository.search(new NativeSearchQueryBuilder()
				.withQuery(new AndQueryBuilder().add(matchQueryBuilder).add(termQueryType))
				.withPageable(new PageRequest(page, 10))
				.withSort(new ScoreSortBuilder().order(SortOrder.DESC))
				.withSort(new ScriptSortBuilder("'qyer'==doc['source'].value?0:('mafengwo'==doc['source'].value?1:2)","number").order(SortOrder.ASC))
				.withSort(new FieldSortBuilder("view_cnt").order(SortOrder.DESC))
				.build());
		System.err.println("----------------------------------------");
		System.err.println("总问题数:"+questionQa.getTotalElements());
		System.err.println("总页数:"+questionQa.getTotalPages());
		System.err.println("----------------------------------------");
		Map<String, Object> map=new HashMap<>();
		List<Map<String, Object>> listmap=new ArrayList<>();
		for(QA qa:questionQa.getContent()){
			
			map.put("question",qa);
			Page<QA> answerQas=qaRepository.search(new NativeSearchQueryBuilder()
			.withQuery(new AndQueryBuilder().add(new TermQueryBuilder("qid", qa.getQid())).add(new TermQueryBuilder("type", "answer")))
			.withSort(new FieldSortBuilder("view_cnt").order(SortOrder.DESC))
			.build());
			List<QA> qas=new ArrayList<QA>();
			for(QA answerQa:answerQas.getContent()){
				qas.add(answerQa);
			}
			map.put("answer", qas);
			listmap.add(map);
		}
		results.put("results", listmap);
		return results;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值