目前跟信息采集相關的一個項目提出了這樣的一個需求:中國銀行等一些部門和政府關系較好,需要在興趣點搜索時優先顯示他們。
我們的興趣點查詢是使用的Lucene進行分詞查詢的,這涉及到我們要對我們搜索出來的結果進行一次優先級排序。這里,我和大家一起探討解決此問題的兩種方案。
2.字典創立時對字典文檔設置優先級2.1.通過Document的setBoost來建立文檔優先級在Lucene4.0前,Document可以通過setBoost來設立文檔的優先級。流程圖為:
但是,此方法在Lucene4.0之后不能使用,因為此之后去掉了Document可以直接setBoost的方法。
2.2.通過對數據源進行排序來解決建立字典文檔優先級在項目中,數據存放在數據庫中,索引是建立在數據庫的該興趣點表上,于是我們可以改變我們的思路,即直接對查詢所得的數據先進行排序,然后再建立索引。
下面我們具體講下實施方案。
2.2.1.修改興趣點表,增加排序字段
這里,我們增加了一個ORDERINDEX排序字段。
2.2.2.在代碼中對數據源進行排序,然后生成字典
符合郵局關鍵字段的數據有多個,我們將北新橋郵局后面的ORDERINDEX修改為1,如果我們輸入郵局,能將北新橋郵局后門首先返回,則表示方法成功。

結果展示:

我們首先可以在創建Document時,增加一個field。該field默認值為false。當我們需要創建的字符串滿足優先查詢字符串時,則將該field的值改為true.
然后,再創建查詢條件時,增加一個建立在field的查詢條件,該查詢條件為should型,查詢值為true,并且設置其對query的影響為低。
流程圖為:



在代碼中通過setBoost有如下幾個缺點:
a.增加了代碼開發量
b.在構建索引字典中遍歷是否滿足優先條件,比較耗時。
鑒于以上缺點,選擇直接通過數據源排序構建索引字典是比較好的方式。
5.擴展由于Lucene中分詞的粒度很難控制,比如郵局二字。當我們輸入郵或者郵局時,是可以有查詢結果的。但是輸入局時卻不能。
針對此種問題,基于Lucene的分詞條件進行修改和擴展,是能根本解決問題的方法之一,但是學習成本略大。
此處我選擇了一種折中的方式來解決,即分詞查詢后判斷查詢結果是否為空,如果是空,則觸發數據庫查詢。
當然,觸發數據庫查詢的前提是,興趣點不能過多。一般項目中興趣點均在10W以內,所以數據庫查詢消耗時間是有限的。
而為什么不直接使用數據庫查詢是在于:
a.分詞查詢可以加速查詢效率。
b.分詞查詢避免數據庫查詢使用過多的like關鍵字。
c.分詞查詢可以建立對拼音檢索的支持。
——歡迎轉載,但保留版權,請于明顯處標明出處:http://m.survivalescaperooms.com/naaoveGIS/
新聞熱點
疑難解答