開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

   根據之前不懈努力的結果,我們終於把基本功能完成了,以爲可以交差了。但是其實才剛剛開始!

我們來看看還差些什麼?
1.全關鍵字匹配(等於==)
2.部分匹配(等於like,這裏還分前匹配,後匹配,帶空格多關鍵字等)
3.空格多關鍵字高亮


暫時先搞定這麼些,一步步來,步子太大容易扯到蛋。

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

這是之前我們定義的模板,基本上滿足的就是簡單的匹配條件,現在我們來慢慢優化一下。

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

首先我們定義一個前綴查詢,這個是最基本的常規思路查詢。
比如用戶輸入 編號的前面幾位,就可以快速的匹配出來,缺點是前綴一定不能斷開,不然就搜
不出來,比如搜的數據是:123 678 我輸入123能搜出來,但是678不是前綴就出不來了。

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

在這裏我用到了matchphraseprefix這個搜索可以用於詞組匹配,比如我只輸入 ”我是中國人“
那麼就會根據分詞檢索 ,只要有匹配的就會返回結果 這裏還允許最後詞組與文中的任意分詞前綴
匹配,所以當我輸入XPZ的時候 XPZ和Opt xpz......的第二個詞組匹配。但是問題是我們這邊有種
特殊情況,用戶可能他知道開頭的前綴幾個字母,知道中間的幾個字母。這種情況下要分段匹配。
顯然目前的2個檢索是不支持的



開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
上面的match查詢匹配就會進行分詞,根據 "XPZ" "TX"來分段查詢。不過還有一種情況,用戶只記得中間那
段數字那怎麼辦呢,感覺現在的條件又不滿足了!

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

所以我在搜索條件裏面又加了wildcard查詢,中文意思就是任意通配符。其實相當於sql裏面的like語法,如果
想要在前後都匹配一個通配符的話可以用?。這裏我們未知前後有多少個通配符,所以用的,代表查詢的是
“前面這裏有N個未知單詞”1687“後面這裏有N個未知單詞”。但是我們還記得說好的全文檢索功能嗎?
前面都是指定的模糊匹配啊,只是某個字段好像不是全文檢索耶。
開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
所以我在下面加了es提供的query_string查詢,這個使用上和match功能差不多。這裏也可以使用通配符




,~等。還可以使用正則表達式。我這邊設置了allow_leading_wildcard=false禁用了前置通配符。基本上一個
簡單的通用的查詢基本完成了。那麼我們把這些加入到模板試試看效果。
開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
這邊我使用的是typeahead接收數據源作爲提示高亮,我們來運行一下。




開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

有沒有發現問題?當我查詢一個關鍵字的時候可以高亮,但是當我空格隔開兩個關鍵字的時候無法高亮展示。
這個肯定不是ES的問題,ES只負責提供查詢。那麼問題定位到了typeahead上面,查詢了文檔發現,原來是
typeahead本身默認只支持單關鍵字高亮,想要多關鍵字高亮必須另外引用mark.js.

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

引用成功後,還需要修改原來綁定 typeahead的寫法。

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮
因爲使用的mark,所以需要將原有的高亮設置爲false,其他寫法相對比較簡單,修改後運行看一下。

開始使用ElasticSearch(八)之模糊檢索,多關鍵字高亮

終於算是成功了!後面我來做拼音查詢,簡體繁體處理。到此爲止先休息一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章