根據以前不懈努力的結果,咱們終於把基本功能完成了,覺得能夠交差了。可是其實才剛剛開始!咱們來看看還差些什麼?
1.全關鍵字匹配(等於==)
2.部分匹配(等於like,這裏還分前匹配,後匹配,帶空格多關鍵字等)
3.空格多關鍵字高亮
暫時先搞定這麼些,一步步來,步子太大容易扯到蛋。正則表達式
這是以前咱們定義的模板,基本上知足的就是簡單的匹配條件,如今咱們來慢慢優化一下。sql
首先咱們定義一個前綴查詢,這個是最基本的常規思路查詢。
好比用戶輸入 編號的前面幾位,就能夠快速的匹配出來,缺點是前綴必定不能斷開,否則就搜
不出來,好比搜的數據是:123 678 我輸入123能搜出來,可是678不是前綴就出不來了。ide
在這裏我用到了matchphraseprefix這個搜索能夠用於詞組匹配,好比我只輸入 」我是中國人「
那麼就會根據分詞檢索 ,只要有匹配的就會返回結果 這裏還容許最後詞組與文中的任意分詞前綴
匹配,因此當我輸入XPZ的時候 XPZ和Opt xpz......的第二個詞組匹配。可是問題是咱們這邊有種
特殊狀況,用戶可能他知道開頭的前綴幾個字母,知道中間的幾個字母。這種狀況下要分段匹配。
顯然目前的2個檢索是不支持的優化
上面的match查詢匹配就會進行分詞,根據 "XPZ" "TX"來分段查詢。不過還有一種狀況,用戶只記得中間那
段數字那怎麼辦呢,感受如今的條件又不知足了!3d
因此我在搜索條件裏面又加了wildcard查詢,中文意思就是任意通配符。其實至關於sql裏面的like語法,若是
想要在先後都匹配一個通配符的話能夠用?。這裏咱們未知先後有多少個通配符,因此用的,表明查詢的是
「前面這裏有N個未知單詞」1687「後面這裏有N個未知單詞」。可是咱們還記得說好的全文檢索功能嗎?
前面都是指定的模糊匹配啊,只是某個字段好像不是全文檢索耶。
因此我在下面加了es提供的query_string查詢,這個使用上和match功能差很少。這裏也可使用通配符
,~等。還可使用正則表達式。我這邊設置了allow_leading_wildcard=false禁用了前置通配符。基本上一個
簡單的通用的查詢基本完成了。那麼咱們把這些加入到模板試試看效果。
這邊我使用的是typeahead接收數據源做爲提示高亮,咱們來運行一下。code
有沒有發現問題?當我查詢一個關鍵字的時候能夠高亮,可是當我空格隔開兩個關鍵字的時候沒法高亮展現。
這個確定不是ES的問題,ES只負責提供查詢。那麼問題定位到了typeahead上面,查詢了文檔發現,原來是
typeahead自己默認只支持單關鍵字高亮,想要多關鍵字高亮必須另外引用mark.js.blog
引用成功後,還須要修改原來綁定 typeahead的寫法。文檔
由於使用的mark,因此須要將原有的高亮設置爲false,其餘寫法相對比較簡單,修改後運行看一下。string
終於算是成功了!後面我來作拼音查詢,簡體繁體處理。到此爲止先休息一下。it