在多值字段上使用短語匹配會產生古怪的行為:
put /my_index/groups/1
執行乙個針對abraham lincoln的短語查詢:
get /my_index/groups/_search}}
令人詫異的是,以上的這份文件匹配了查詢。即使abraham以及lincoln分屬於name陣列的兩個人名中。發生這個現象的原因在於陣列在es中的索引方式。
當john abraham被解析時,它產生如下資訊:
然後當lincoln smith被解析時,它產生了:
換言之,es對以上陣列分析產生的詞條列表和解析單一字串john abraham lincoln smith時產生的結果是一樣的。在我們的查詢中,我們查詢鄰接的abraham和lincoln,而這兩個詞條在索引中確實存在並且鄰接,因此查詢匹配了。
幸運的是,有乙個簡單的方法來避免這種情況,通過position_offset_gap引數,它在字段對映中進行配置:
delete /my_index/groups/}}
position_offset_gap設定告訴es需要為陣列中的每個新元素設定乙個偏差值。因此,當我們再索引以上的人名陣列時,會產生如下的結果:
現在我們的短語匹配就無法匹配該文件了,因為abraham和lincoln之間的距離為100。你必須要新增乙個值為100的slop的值才能匹配。
短語查詢(phrase query)只是簡單地將不含有精確查詢短語的文件排除在外,而鄰近查詢(proximity query) - 乙個slop值大於0的短語查詢 - 會將查詢詞條的鄰近度也考慮到最終的相關度_score中。通過設定乙個像50或100這樣的高slop值,你可以排除那些單詞過遠的文件,但是也給予了那些單詞鄰近的文件乙個更高的分值。
下面針對quick dog的鄰近查詢匹配了含有quick和dog的兩份文件,但是給與了quick和dog更加鄰近的文件乙個更高的分值:
post /my_index/my_type/_search}}}
},}]}
儘管鄰近度查詢(proximity query)管用,但是所有的詞條都必須出現在文件的這一要求顯的過於嚴格了。這個問題和我們在全文搜尋(full-text search)一章的精度控制(controlling precision)一節中討論過的類似:如果7個詞條中有6個匹配了,那麼該文件也許對於使用者而言已經足夠相關了,但是match_phrase查詢會將它排除在外。
相比將鄰近度匹配作為乙個絕對的要求,我們可以將它當做乙個訊號(signal) - 作為眾多潛在匹配中的一員,會對每份文件的最終分值作出貢獻(參考多數字段(most fields))。
我們需要將多個查詢的分值累加這一事實表示我們應該使用bool查詢將它們合併。
我們可以使用乙個簡單的match查詢作為乙個must子句。該查詢用於決定哪些文件需要被包含到結果集中。可以通過minimum_should_match引數來去除長尾(long tail)。然後我們以should子句的形式新增更多特定查詢。每個匹配了should子句的文件都會增加其相關度。
get /my_index/my_type/_search}},"should"
: }}}
}}
毫無疑問我們可以向should子句中新增其它的查詢,每個查詢都用來增加特定型別的相關度。
Mysql 同一欄位多值模糊查詢
同一欄位多值模糊查詢,使用多個or進行鏈結,效率不高,但沒有更好的解決方案。有看到charindex 關鍵字,可查詢結果並不是模糊,舉個栗子 例如select from table where charindex name 張三,李四 0 二 同一值多字段模糊查詢,使用concat關鍵字,舉個栗子 ...
多值模糊查詢報表的製作
但是使用者的需求往往是無止境的!最典型就是把這兩種好使的方法結合起來,也就是兩種查詢的結合 在引數框中輸入多個關鍵字,根據多個關鍵字進行模糊查詢。比如,使用者要根據產品名稱進行多值模糊查詢,當輸入為 乳酪,糖 時,希望找出產品名稱中含有乳酪或糖的產品列表,如下圖所示 為了程式猿哥哥可以早日跟加班 s...
多值模糊查詢報表的製作
但是使用者的需求往往是無止境的!最典型就是把這兩種好使的方法結合起來,也就是兩種查詢的結合 在引數框中輸入多個關鍵字,根據多個關鍵字進行模糊查詢。比如,使用者要根據產品名稱進行多值模糊查詢,當輸入為 乳酪,糖 時,希望找出產品名稱中含有乳酪或糖的產品列表,如下圖所示 為了程式猿哥哥可以早日跟加班 s...