不少時候搜索用戶對查詢語句具備模糊感受,他們只能提供大約的描述。好比一個語句的部分,或者字句順序顛倒等。經過模糊查詢能夠幫助用戶更準確的找出他們但願搜索的結果。spa
模糊查詢包括先後綴,語句(phrase)查詢。前綴查詢在非文本查詢和全文查詢字段中使用是有着不一樣的效果:在非文本字段查詢中咱們須要嚴格按照詞字順序進行匹配,而全文查詢中因爲目標字段在構建索引時已經進行了分詞處理,因此匹配是在分詞中進行匹配的。下面是一些非文本先後綴查詢的例子:code
POST /bank/_search { "query" : { "prefix" : { "address.keyword": "880" } } } POST /bank/_search { "query" : { "wildcard": { "address.keyword": "*Holmes*" } } } POST /bank/_search { "query" : { "regexp": { "address.keyword": ".*Holmes.*" } } }
elastic4例子: regexp
val qPrefix = search("bank").query(prefixQuery("address.keyword","880")) val qWildcard = search("bank").query(wildcardQuery("address.keyword","*Holmes*")) val qRegex = search("bank").query(regexQuery("address.keyword",".*Holmes.*"))
全文查詢中經常使用match_phrase:這是一種語句查詢。如:blog
GET /books/_search { "query": { "match_phrase": { "publisher": "人民出版社" } } }
一個有意義的語句中每一個字在句子中的位置都是按順序的。「人民出版社」可能被分詞成「人民」、「人民版」,「人民社」、「社「等。但實際上不少圖書行內人稱「人社版「。也就是說應該允許必定程度的靈活性,即字在句中的位置允許必定程度的錯位。這個程度能夠用slop來表示:索引
GET /books/_search { "query": { "match_phrase": { "publisher": { "query": "人社版", "slop" : 10 } } } }
上面這個slop = 10 的意思是咱們能夠允許十步字距調整。slop值越大覆蓋詞段越廣,不過可能會影響效率。elastic4請求表達以下:io
val qPhrase = search("books").query( matchPhraseQuery("PUBLISHER","人社版").slop(10) )
另外,match_phrase在用戶錄入查詢條件時能夠做爲提示(auto-completion)或者即錄即查(search_as_you_type)使用。這時用前綴查詢match_phrase_prefix最爲合適。由於能夠兼顧英文到字母層級的錄入查詢:ast
GET /books/_search { "query": { "match_phrase_prefix": { "publisher": { "query": "人社版", "slop" : 10 } } } }
用elastic4來表示:class
val qPhrasePfx = search("books").query( matchPhrasePrefixQuery("PUBLISHER","人社版").slop(10) )