默认匹配查询
按照ES的默认分词计算匹配度的结果
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("nickName", nickName);
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);
权重查询
提升某些字段的权重,但是这样会导致完全匹配的被排在后面的问题。
boolQuery.should(QueryBuilders.matchQuery("nickName", queryString).boost(3.0f));
boolQuery.should(QueryBuilders.matchQuery("realName", queryString).boost(1.f));
即使真实姓名完全匹配,也会根据权重被排在后面。
Multi Match Query
The way the multi_match query is executed internally depends on the type parameter, which can be set to:
best_fields
(default) Finds documents which match any field, but uses the _score from the best field.
most_fields
Finds documents which match any field and combines the _score from each field.
cross_fields
Treats fields with the same analyzer as though they were one big field. Looks for each word in any field.
phrase
Runs a match_phrase query on each field and uses the _score from the best field.
phrase_prefix
Runs a match_phrase_prefix query on each field and uses the _score from the best field.
bool_prefix
Creates a match_bool_prefix query on each field and combines the _score from each field.
大致的意思就是
- best_fields:(默认)查找匹配的文档,使用最佳字段的得分。
- most_fields:查找匹配的文档,合并每个字段的得分。
- cross_fields:用同一个分析器处理一个大字段,查找每个单词。
- phrase:使用来自最佳字段的分数。
- phrase_prefix:使用最佳字段的分数。
- bool_prefix:合并每个字段的得分。
场景1:最佳字段查询
搜索时,完全匹配的关键字排名更靠前,采用best_fields
进行查询。
String queryString = "ChadJ";
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
.multiMatchQuery(queryString, "nickName", "realeName")
.type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
.tieBreaker(0.1f);
boolQuery.must(multiMatchQuery);
- 设置type为
best_fields
- 未完全匹配的文档分数乘以系数0.1
- 拉大完全匹配和未完全匹配的分数区间。
场景2:最佳字段优化,相同值的权重
当昵称nickName和realeName相同的时候,想让真实姓名的字段权重更高。
String queryString = "ChadJ";
// 最佳字段 + 降低除了realeName之外字段的权重系数
MatchQueryBuilder nickNameQuery = QueryBuilders.matchQuery("realeName", queryString);
MatchQueryBuilder realeNameQuery = QueryBuilders.matchQuery("nickName", queryString).boost(0.8f);
DisMaxQueryBuilder disMaxQueryBuilder = QueryBuilders.disMaxQuery().add(nickNameQuery ).add(realeNameQuery );
queryBuilder.withQuery(disMaxQueryBuilder);
通过boost可以降低某些条件的权重系数
网友评论