ES搜索結果調優

訪問個人博客html

自從使用 ElasticSearch 重構了主站的搜索項目以後,以後又陸續接入了其餘兩個項目,目前使用 SpringBoot 方式跑了一個僞集羣,主站使用的時候,比較穩定,沒有人反饋說有問題。java

但新接入的一個站點商務反饋說,搜索不夠準確,徹底匹配的關鍵詞不是排在搜索結果列表首位,跑到搜索上去看了一眼,確實徹底匹配的結果分數不是最高的,致使沒有排在結果首位,今天就來解決這個問題。git

<!--more-->github

默認匹配查詢

先看看我以前寫的查詢代碼片斷,elasticsearch

MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "name", "author");
boolQuery.must(matchQuery);

這種寫法,徹底沒有對搜索結果的平分進行干擾,只是按照 ES 的默認分詞計算匹配度的結果。ide

權重查詢

我嘗試了使用權重查詢,即提高某些字段的權重,可是設置以後,結果反而更加不盡如人意。ui

boolQuery.should(QueryBuilders.matchQuery("name", queryString).boost(3.0f));
boolQuery.should(QueryBuilders.matchQuery("author", queryString).boost(1.f));

這樣進行查詢以後,若是想要查詢做者,可是做品名稱的權重更高些,因此徹底匹配的做者也被排在了後面。spa

最佳字段查詢

看了官方博客和一篇博客文章,發現 multi-match-query 的高級查詢方式。code

multi_match 多匹配查詢的類型有多種,其中的三種恰巧與 瞭解咱們的數據 中介紹的三個場景對應,即: best_fieldsmost_fieldscross_fields (最佳字段、多數字段、跨字段)。htm

這裏咱們想要搜索時,徹底匹配的關鍵字排名更靠前,因此這裏使用最佳字段 best_fields 進行查詢

MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
                    .multiMatchQuery(queryString, "name", "author")
                    .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
                    .tieBreaker(0.1f); 
boolQuery.must(multiMatchQuery);

首先設置 type 爲 BEST_FIELDS,其次,咱們想要徹底匹配的分數高點,那麼就讓沒有徹底匹配的分文檔評分低便可,我這裏乘以了 0.1 的係數,係數的範圍是 0-1 之間。

加上了係數以後,不徹底匹配的文檔評分就被拉開了,就達到了個人最終目的。

資源下載

參考

相關文章
相關標籤/搜索