寫在前面
第一次在簡書寫博客竭沫,一方面是想記錄下自己技術(shù)學(xué)習(xí)之路播聪,另一方面將自己的認知提出來與大家溝通交流癣猾。
背景介紹
廢話不多說慕蔚,下面分享下在線搜索使用solr的一些調(diào)研經(jīng)驗和遇到的坑。
首先說明下巍佑,之所以用solr做在線搜索是因為項目組之前有過使用經(jīng)驗茴迁,主要是用于日志檢索,用的比較簡單萤衰。但從調(diào)研業(yè)界的做法來看堕义,Elasticsearch更適合做在線實時搜索,實時搜索的效率是solr的幾十倍脆栋,到solr也有自己的優(yōu)勢這里不多說倦卖,后面補充。
做的產(chǎn)品是新聞客戶端椿争。搜索的需求一開始是標題匹配優(yōu)先怕膛,其次文章內(nèi)容匹配,結(jié)果分別按時間倒排秦踪。要求模糊匹配褐捻,準確度80%(這個匹配度是從產(chǎn)品層面定義,可簡單理解為:搜索詞是10個字椅邓,匹配上8個字才認為匹配上)柠逞。
索引
首先做檢索肯定需要對需要匹配的字段做索引。在配置文件中設(shè)置title和content屬性indexed=true景馁,索引的意義不用多說板壮,相當(dāng)于空間換搜索時間的概念。
分詞器
這里介紹下分詞器合住。搜索引擎不可能拿用戶輸入的詞直接去做匹配绰精,所以就需要做分詞,目前solr支持的最好的開源分詞器是IKAnalyzer(中文分詞器)聊疲。比如“王寶強和馬蓉離婚事件”茬底,理想的分詞結(jié)果應(yīng)該是“王寶強”、“和”获洲、“馬蓉”、“離婚”殿如、“事件”贡珊。如果你認為“和”這個詞是無意義影響匹配效果最爬,可在stopword.doc中配置這個詞,那么搜索時就會被過濾门岔。(其實IK做不到這樣的分詞效果爱致,目前應(yīng)該是哈工大的分詞器效果比較理想能做到這樣的效果,可用c語言封裝so庫提供java調(diào)用)寒随。
自定義評分
要實現(xiàn)上面的需求最大的難度是需要自定義打分規(guī)則糠悯,而不是根據(jù)匹配度。solr提供了一些函數(shù)來改變打分妻往。首先要設(shè)置defType為edismax互艾,edismax是boost函數(shù)與原score相乘作為打分結(jié)果,dismax是相加讯泣,一般自定義打分都設(shè)置為edismax纫普,因為score是其中一個維度(匹配度)。打分函數(shù)是設(shè)置bf字段好渠,函數(shù)就是 query product exists等solr函數(shù)根據(jù)自定義規(guī)則計算一個打分結(jié)果的函數(shù)昨稼。將計算結(jié)果*score,搜索結(jié)果按這個最終打分來排拳锚。另外還有個參數(shù)mm假栓,來控制匹配度,如80%霍掺,表示必須分詞結(jié)果的所有詞去匹配匾荆,需要80%的詞匹配上。
效果分析
按以上策略滿足了產(chǎn)品需求抗楔,但實際效果比較差棋凳,因為自定義評分函數(shù)結(jié)果對score影響較大,搜索結(jié)果前面幾條可能匹配度不是最高的连躏,但也滿足了80%剩岳,有匹配度更高的沒有出現(xiàn)在前面。這里就需要對自定義評分函數(shù)的參數(shù)不斷調(diào)優(yōu)入热,達到一個合理的值拍棕。事實上最終我們放棄了這個自定義評分的方案,產(chǎn)品最終一方面是希望按匹配度來排序勺良,另一方面要求匹配的精確度高绰播。最后我們將mm值設(shè)為了100%。
結(jié)語
在不是必要的前提下尚困,盡量不要使用自定義評分函數(shù)蠢箩,因為會影響打分結(jié)果。如果一定要使用,那么需要優(yōu)化好自定義評分的函數(shù)谬泌,達到你預(yù)期的搜索效果滔韵。
這里僅僅是用一個使用實例來拋出了使用solr的話題,一些細節(jié)問題待后續(xù)持續(xù)討論掌实。