比如有个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"))

本文探讨了在Elasticsearch中如何通过设置person_name字段的子字段为不分词类型,解决精确匹配时分词器导致的排序问题。介绍了使用match_phrase精确查询子字段并设置高权重,以及使用match模糊查询person_name字段的方法。

被折叠的 条评论
为什么被折叠?



