您現在的位置是:首頁 > 運動

愛番番企業查詢結果最佳化實踐

由 百度Geek說 發表于 運動2022-10-13
簡介3.1 關鍵詞匹配度1、新增單獨根據企業名稱、法人等使用者重點關注資訊短語匹配查詢match_phrase 要求必須命中所有分詞,並且返回的文件命中的詞也要按照查詢短語的順序,使用 slop 設定詞的間距,要求較嚴格,滿足條件才能被查詢到

譜的詞語有什麼

愛番番企業查詢結果最佳化實踐

作者 |

summer

導讀

愛番番企業查詢彙集了全網2億+企業多維度全方位資訊,使用開源全文搜尋引擎Elasticsearch(下文簡稱ES)

作為

搜尋平臺,致力於讓使用者更快更準的找到所需企業,但怎樣能讓使用者搜尋到滿意的符合預期的結果呢?

本文將會講述愛番番企業查詢在檢索結果最佳化方面的實踐,期望與大家一同交流。

全文3943字,預計閱讀時間10分鐘。

01

初識

資料同步,平臺搭建省略,咱們直奔主題,本文中的樣例來源於測試錄入,僅用於dsl查詢語句結果展示。

我:

hello ES ,很高興與你相識,我現在有個需求,需要根據關鍵資訊查詢出包含該關鍵資訊的企業,用什麼比較合適呢 ?

ES:

匹配查詢 match 最合適不過了,它是一個高階 全文查詢 既能處理全文欄位,又能處理精確欄位。

我:

企業維度好多,我想多個欄位進行匹配,使用 match 有些麻煩,有更便捷的方式嗎?

ES:

可以試試multi_match, multi_match預設情況下,它會為每個欄位生成一個 match 查詢。

我:

哇,太好了,我試試。

查到結果了,但結果中有些 name 中沒有 “ 網訊科技 ” 其他欄位中可以查到,有些 “ 網訊科技 ” 沒在一起不是連續匹配的,甚至有些資料順序還不一樣,這樣的結果是我們想要的嗎 ?

每個平臺對結果有自己的要求,有自己的評判標準,不能一概而論,我們透過使用者調研,行為分析等方式發現使用者主要關注以下幾點:

查詢結果與關鍵詞的匹配度,主要側重企業名稱和法人;

期望可以根據使用者關注的條件,查詢到相關企業資訊;

在關鍵詞匹配到的前提下,希望能夠按照企業健康情況排列( 如:經營狀態是否正常,註冊資本怎麼樣,是否存在風險等 )。

如何讓使用者關注的企業被檢索出來呢 ?該如何進行最佳化呢 ?

02

探索

想要解決問題,先要知道問題出現的原因,這樣才能針對性的解決,下面讓我們走進es吧。

ES 是一個開源的搜尋引擎,建立在一個全文搜尋引擎庫

Apache Lucene

基礎之上,全文搜尋主要包括索引建立和索引查詢兩個部分。

愛番番企業查詢結果最佳化實踐

索引建立:

獲取文件,將原始文件按照一定規則分詞,建立索引的過程。

分詞:

analysis 即文字分析,是把全文字轉化為一系列單詞( term / token )的過程,也叫分詞;在 es 中透過 analyzer ( 分詞器 ) 實現分詞,可使用內建分詞器也可按需定製分詞器。

analyzer ( 分詞器 ):

由三部分組成:

Character Filter:將文字中 html 標籤剔除掉;

Tokenizer:按照規則進行分詞,在英文中按照空格分詞;

Token Filter:將切分的單詞進行加工,小寫,刪除 stopwords,增加同義詞;

會按照規則進行分詞,可透過 _analyze 查詢分詞情況。

建立索引:

倒排序索引包含兩個部分:

單詞詞典:記錄所有文件單詞,記錄單詞到倒排列表的關聯關係;

倒排列表:記錄單詞與對應文件結合,由倒排索引項組成;

倒排索引項:

文件 id( DocId, Document Id ),包含單詞的文件 id,用於獲取原始資訊;

詞頻( TF,Term Frequency ),記錄 Term 在每篇文件中出現的次數,用於後續相關性算分( TF/IDF,BM25 );

位置( Position ),記錄 Term 在每篇文件中的分詞位置( 多個 ),用於做詞語搜尋( Phrase Query );

偏移( Offset ),記錄 Term 在每篇文件的開始和結束位置,用於高亮顯示等。

由此可知索引中記錄了分詞的位置資訊, 可用來解決不連續匹配的情況。

索引查詢

:根據關鍵字查詢索引、根據索引查詢具體文件、從而找到要查詢的內容返回結果的過程。

ES 使用

布林模型(Boolean model)

查詢匹配文件,並用一個名為

實用評分函式(practical scoring function)

的公式來計算相關度。這個公式借鑑了

詞頻/逆向文件頻率(term frequency/inverse document frequency)

向量空間模型(vector space model)

,同時也加入了一些現代的新特性,如協調因子(coordination factor),欄位長度歸一化(field length normalization),以及詞或查詢語句權重提升。

(詳見官方文件:

https://www。elastic。co/guide/cn/elasticsearch/guide/current/practical-scoring-function。html#practical-scoring-function

預設情況下,返回結果是按相關性倒序排列的,每個文件都有相關性評分,用一個正浮點數字段 _score 來表示。_score 的評分越高,相關性越高。查詢語句會為每個文件生成一個 _score 欄位。評分的計算方式取決於查詢型別不同的查詢語句用於不同的目的:fuzzy 查詢會計算與關鍵詞的拼寫相似程度,terms 查詢會計算找到的內容與關鍵片語成部分匹配的百分比,但是通常我們說的 relevance 是我們用來計算全文字欄位的值相對於全文字檢索詞相似程度的演算法。

影響相關度主要工具:

1、查詢時權重提升,任意型別的查詢都能接受 boost 引數;

2、使用 constant_score 查詢,為任意一個匹配的文件指定評分,忽略 TF/IDF 資訊;

3、使用 function_score 查詢,它允許為每個與主查詢匹配的文件應用一個函式,可以改變甚至完全替換原始查詢評分 _score 。

可透過 explain 獲取 dsl 查詢結果的評分細節,僅做除錯,生產環境不建議使用。

03

最佳化

有了相關原理的支援,下面讓我們看下上述使用者關注問題在愛番番中的解決實踐吧。

3.1 關鍵詞匹配度

1、新增單獨根據企業名稱、法人等使用者重點關注資訊短語匹配查詢

match_phrase 要求必須命中所有分詞,並且返回的文件命中的詞也要按照查詢短語的順序,使用 slop 設定詞的間距,要求較嚴格,滿足條件才能被查詢到。

2、設定企業名稱和法人權重,法人加入短語匹配

愛番番企業查詢結果最佳化實踐

可以根據資料質量透過 boost 調整權重,根據資料長度適當使用短語匹配,match 和 match_phrase 搭配使用,即能避免單獨使用match_phrase 導致的數量減少又能提高文件相關性評分。

3.2 新增篩選項

將使用者關注的條件新增到篩選項裡面,讓使用者設定篩選條件,根據篩選條件過濾,查詢到符合條件的企業。

愛番番企業查詢結果最佳化實踐

愛番番企業查詢結果最佳化實踐

使用 bool 查詢的過濾器 filter,過濾器可減少查詢範圍,被過濾掉的內容不會影響返回內容的排序,不計算相關性評分,可以使用 ES 內部的快取,提升查詢速度。

3.3 自定義評分

function_score 查詢,能夠將全文查詢與最新發生這種因子結合在一起評分,可以不完全根據評分 _score 或時間 date 進行排序;可以使兩個效果融合:仍然根據全文相關度進行排序,但也會同時考慮其他因素。

function_score 提供了五種打分函式:

weight:為每個文件應用一個簡單而不被規範化的權重提升值,最終結果_score乘以一個權重數值;

random_score:為每個使用者都使用一個不同的隨機評分對結果排序;

field_value_factor:使用某個欄位影響_score;

decay fucntion:包括 gauss、exp、linear 三種衰減函式;

script_score:這是最靈活的方式,使用自定義指令碼控制評分計算;

結合愛番番自身場景,因子較多,涉及到邏輯處理,我們選擇了最靈活的script_score。

愛番番企業查詢結果最佳化實踐

在指令碼中透過 doc[‘field’] 獲取文件欄位,doc[‘field’]。value 獲取文件欄位值。

使用了自定義評分最終結果的 score 記為 result_score 的計算過程如下:

原始分數:原始文件相關性評分 score ,記為query_score 。

自定義函式得分:執行自定義打分函式得到的新的文件分數,記為 func_score 。

最終結果 score:最終文件分數 result_score 等於 query_score 與 func_score 按某種方式計算的結果(計算方式由引數 boost_mode決定,預設是相乘)。

評分因子較多,每一個小的調整都會導致結果變更,調整前需要確定結果最佳化評判標準,調整中要有所側重,有所平衡,上線後要採集使用者查詢滿意度,或透過埋點等方式側面評估效果,同時進行 badcase 收集,便於後續最佳化。

3.4 主動干預

影響相關性評分因子較多,我們需要根據資料情況進行取捨,達到結果的相對平衡,難免會有 badcase 的出現,為了提升效果,我們還進行了如下最佳化:

1、提取關鍵詞

對重點資訊( 如:企業名稱 )可以提取關鍵詞,新增 mapping ,關鍵詞使用短語匹配,提升相關性評分,關鍵詞抽取可檢視

企業知識圖譜技術與應用

2、二次排序

針對使用者查詢結果設定規則提取一定數量,根據規則進行關鍵詞匹配,匹配到關鍵詞的企業排名放到前面。

最終查詢結果:

愛番番企業查詢結果最佳化實踐

04

總結

查詢結果最佳化是個循序漸進的過程,需要不斷調整,對比最佳化效果,其中免不了有一些權衡和取捨,找到適合自己產品的最優設定。

愛番番企業查詢結果最佳化就介紹到這裡了,但這並不意味著我們的最佳化到此結束,優化出適合自己業務,符合使用者要求的查詢結果,是我們長期的目標,我們會為此不斷努力。

——END——

推薦文章