1. 程式人生 > >ES搜尋結果調優

ES搜尋結果調優

訪問我的部落格

自從使用 ElasticSearch 重構了主站的搜尋專案之後,之後又陸續接入了其他兩個專案,目前使用 SpringBoot 方式跑了一個偽叢集,主站使用的時候,比較穩定,沒有人反饋說有問題。

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

預設匹配查詢

先看看我之前寫的查詢程式碼片段,

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

這種寫法,完全沒有對搜尋結果的平分進行干擾,只是按照 ES 的預設分詞計算匹配度的結果。

權重查詢

我嘗試了使用權重查詢,即提升某些欄位的權重,但是設定之後,結果反而更加不盡如人意。

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

這樣進行查詢之後,如果想要查詢作者,但是作品名稱的權重更高些,所以完全匹配的作者也被排在了後面。

最佳欄位查詢

看了官方部落格和一篇部落格文章,發現 multi-match-query 的高階查詢方式。

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

這裡我們想要搜尋時,完全匹配的關鍵字排名更靠前,所以這裡使用最佳欄位 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 之間。

加上了係數之後,不完全匹配的文件評分就被拉開了,就達到了我的最終目的。

資源下載

參考