Elasticsearch-script 脚本排序
elasticsearch解决某一字段值等于某字符串时优先排序问题,这个很让我困扰,数据库中source字段为qyer时排在前面,对,就是这样用script完成这个排序public Map<String, Object> findByQuestion(String content,int page){Map<String, Object> results=new HashM
·
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;
}
更多推荐
已为社区贡献4条内容
所有评论(0)