閱讀881 返回首頁    go 阿裏雲 go 技術社區[雲棲]


來往——7天輕鬆定製屬於自己的搜索引擎

【Open Search產品評測】來往(https://www.laiwang.com/ )

 

[使用背景]

相信很多人都遇到過要給網站或者app做一個搜索功能的需求,很久之前自己折騰過lucene,搞了很久,要自己搞中文分詞(比如用中科院的那個)重寫tokenizer,自己建索引,做實時更新流程,數據量大了還要考慮怎樣給數據分環等等各種問題。從2014年初開始接觸opensearch,當時來往要做紮堆搜索(包括搜紮堆,搜帖子,搜某個堆內的帖子,搜堆內成員等)從上手到熟練使用opensearch隻用了大概不到1周的時間,總體來說非常滿意。感覺這個東西非常符合互聯網創業的節奏,簡單方便,很快的就能實現自己的搜索接口。

 

[使用過程]

以建立一個來往的紮堆搜索為例(如果不知道紮堆是啥,就理解成類似於百度貼吧的東西),比如搜趙薇,我們能找到趙薇相關的紮堆。我來簡單講述一下怎樣迅速的用opensearch搭建一個搜索接口。

1. 注冊opensearch的賬號,按操作來就好了。

2. 創建一個應用,定義索引結構。例如:

 這裏麵可搜索,可以理解成需要建索引的字段,比如紮堆的名字,紮堆的pinyin名字,紮堆的標簽等。可聚合我這目前沒有使用,先不管這個。可過濾,比如某個字段(checkin_type)表示有的紮堆是私密的,有的不是,那麼需要把checkin_type勾選成可過濾,這樣在檢索的時候可以寫語句來選取保留哪些符合條件的搜索結果。可展示表示,搜索接口出來我們要給client顯示哪些字段。

3. 數據導入,opensearch提供了3種數據導入的方式可以根據應用需要自己選擇。比如從mysql導入,都是圖形化的界麵,需要做的隻是將mysql中的字段和剛才建立的索引結構的字段對應起來。也可以通過hdfs,和sdk還有http的api把數據push過來,sdk和http的api方式非常靈活,具體做法可以參考幫助文檔講的很清楚。[注:mysql\hdfs隻有內網支持]

4. 建立索引,在界麵裏點擊數據導入這個tab,會有索引重建這塊,點擊現在重建,opensearch會從剛才我們配置的數據庫裏,按照配置的字段對應方式,從數據庫裏讀出數據並建立索引。等待這個過程結束,就可以訪問搜索接口了。

5. 訪問搜索接口,在應用首頁的右上角點搜索測試。

如圖中有http的接口,訪問後返回的是json格式的搜索結果數據。這樣最簡單的一個搜索雛形就這樣搭建出來了。

 

[使用技巧]

下邊說一些可能會遇到的需求和問題:

1. 比如遇到排序需求,例如需要A字段命中比B字段的命中要更重要,即A字段匹配的好的要排在前麵(比如title和content)。這樣可以自定義排序公式,可以參考文檔這裏給了很多排序函數,比如可以用bm25算法算靜態分,text_relevance算和某個字段的匹配程度,fieldterm_proximity計算匹配的密度,也有按時間字段衰減的函數。

2. 比如遇到一些召回方麵的需求,例如搜zhoujielun希望可以搜出周傑倫,搜明星可以出所有明星相關的文檔(並不一定包含明星兩個字),可能通常比較大的搜索引擎通過query refine和query correct這種類似的模塊來分析query來擴大召回,這裏可以稍微投機一下,我們把確定的希望召回的term可以做成一個新的字段放到索引結構裏,並給這些字段一個排序的權重來做到召回並可以合適的排序。

3. 比如遇到搜索附近的事物的需求,排序函數裏提供了一個distance函數,是算球麵距離的,這個方法是o(n)的,如果數據多了,可能效率會有影響。我們可以在索引結構裏做一個字段,用geohash算法(此算法參考https://en.wikipedia.org/wiki/Geohash)將query裏的二維坐標變成一些前綴相同的字符串(比如我們可以固定留5,6,7,8位的),把這些geohash後的字符串放到這個新的索引字段裏。檢索的時候也同樣把輸入的二維坐標算出5,6,7,8位的geohash串,在這些串能索引到的數據裏用distance函數進行更精準的距離計算並排序,可以很高效的完成附近的事物的搜索。

4. 另外數據量這塊,目前數據量最大的索引約有5000w個doc,這個狀況下在qps500的時候依然可以做到10ms以內返回搜索結果(當然搜索結果的每個doc的可展示字段不要太大,這樣響應時間會因為網絡傳輸數據變的慢一些)。

 

[需求]

1. 還有發現一些查詢的badcase,在query分析和結果的求交求並這塊還是有些badcase的,例如假如我們搜 “周傑倫 中學 照片”,按照重要程度感覺上是周傑倫>>中學=照片,即使沒有全命中的文章,那麼也應該召回周傑倫 照片或者 周傑倫的文檔。相信這塊會越做越好的。

OpenSearch解答:目前正在開發一個新功能,會對用戶query做多個維度的改寫,比如低權重term降權,支持用戶自定義詞典(同義詞、糾錯、停用詞、專業詞等),會進一步提升長尾詞的搜索效果,降低無結果率。

 

2. 如果能提供相關搜索功能就更好了:). 比如根據這個搜索應用經常搜的一些query的log,給出搜這個query的用戶還可能搜什麼詞兒。

OpenSearch解答:相關搜索、下拉提示等功能都已經在規劃中,包括後續的點擊反饋、個性化搜索我們都已經開始調研工作了,敬請期待。

 

[總結]

總之,opensearch幫助使用者解決了搜索功能上很多很多的問題,使得我們在短時間內就可以很容易的按照自己產品的需求定製出自己的搜索引擎。

 

最後更新:2017-04-03 05:39:58

  上一篇:go 淘點點如何輕鬆實現整套O2O類搜索解決方案?
  下一篇:go OpenCV訓練分類器