比如有个person_name字段,正常查询的时候按照_score排序,查询张建的时候,张建建的分值比张建的分值大,导致排序的时候张建建排在张建之前,但是按照常理来说,张建应该排在张建建之前,这就涉及到es的分词器以及分值计算问题了
解决方法是在person_name字段中设置一个子字段,不分词
"person_name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "store": true, "index_options": "docs", "fields": { "raw": { "type": "keyword", "store": true } } }
查询的时候,使用match_parse精确查询子字段并用boost设置较大的权重,使用match模糊查询person_name字段
es插件查询代码
{ "query": { "bool": { "should": [ { "match_phrase": { "person_name.raw": { "query": "张建建", "boost": 10 } } }, { "match": { "person_name": { "query": "张建建" } } } ] } } }
java代码
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.should(QueryBuilders.matchPhraseQuery("person_name.raw",keywordVal).boost(4)); queryBuilder.should(QueryBuilders.matchQuery("person_name", keywordVal).operator(Operator.AND).analyzer("ik_max_word"))