默認(rèn)匹配查詢
按照ES的默認(rèn)分詞計(jì)算匹配度的結(jié)果
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("nickName", nickName);
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);
權(quán)重查詢
提升某些字段的權(quán)重班挖,但是這樣會(huì)導(dǎo)致完全匹配的被排在后面的問題鲁捏。
boolQuery.should(QueryBuilders.matchQuery("nickName", queryString).boost(3.0f));
boolQuery.should(QueryBuilders.matchQuery("realName", queryString).boost(1.f));
即使真實(shí)姓名完全匹配,也會(huì)根據(jù)權(quán)重被排在后面萧芙。
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:(默認(rèn))查找匹配的文檔给梅,使用最佳字段的得分。
- most_fields:查找匹配的文檔双揪,合并每個(gè)字段的得分动羽。
- cross_fields:用同一個(gè)分析器處理一個(gè)大字段,查找每個(gè)單詞盟榴。
- phrase:使用來自最佳字段的分?jǐn)?shù)曹质。
- phrase_prefix:使用最佳字段的分?jǐn)?shù)。
- bool_prefix:合并每個(gè)字段的得分。
場景1:最佳字段查詢
搜索時(shí)羽德,完全匹配的關(guān)鍵字排名更靠前几莽,采用best_fields
進(jìn)行查詢。
String queryString = "ChadJ";
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
.multiMatchQuery(queryString, "nickName", "realeName")
.type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
.tieBreaker(0.1f);
boolQuery.must(multiMatchQuery);
- 設(shè)置type為
best_fields
- 未完全匹配的文檔分?jǐn)?shù)乘以系數(shù)0.1
- 拉大完全匹配和未完全匹配的分?jǐn)?shù)區(qū)間宅静。
場景2:最佳字段優(yōu)化章蚣,相同值的權(quán)重
當(dāng)昵稱nickName和realeName相同的時(shí)候,想讓真實(shí)姓名的字段權(quán)重更高姨夹。
String queryString = "ChadJ";
// 最佳字段 + 降低除了realeName之外字段的權(quán)重系數(shù)
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可以降低某些條件的權(quán)重系數(shù)