Elasticsearch基本語法
阿新 • • 發佈:2018-11-20
match和match_phrase區別
match: 索引中只要有任意一個匹配拆分後詞就可以出現在結果中,只是匹配度越高的排越前面
match_phrase: 索引中必須同時匹配拆分後詞就可以出現在結果中
ex:
GET /product_index/product/_search { "query": { "match_phrase": { "product_name": "PHILIPS toothbrush" } } }
product_name必須同時包含PHILIPS和toothbrush才會返回。
match的另一些用法
滿足分詞結果中所有的詞,而不是像上面,任意一個就可以的。
GET /product_index/product/_search { "query": { "match": { "product_name": { "query": "PHILIPS toothbrush", "operator": "and" } } } }
只要命中50%的分詞就返回
GET /test_index/test/_search { "query": { "match": {"product_name": { "query": "java 程式設計師 書 推薦", "minimum_should_match": "50%" } } } }
multi_match: 查詢a和b欄位中,只要有c關鍵字的就出現
GET /test_index/test/_search { "query": { "multi_match": { "query": "c", "fields": [ "a", "b" ] } } }
multi_match 跨多個 field 查詢,表示查詢分詞必須出現在相同欄位中
GET /product_index/product/_search { "query": { "multi_match": { "query": "PHILIPS toothbrush", "type": "cross_fields", "operator": "and", "fields": [ "product_name", "product_desc" ] } } }
match_phrase + slop
- 在說 slop 的用法之前,需要先說明原資料是:大吉大利,被分詞後至少有:大 吉 大 利 四個 term。
- match_phrase 的用法我們上面說了,按理說查詢的詞必須完全匹配才能查詢到,吉利 很明顯是不完全匹配的。
- 但是有時候我們就是要這種不完全匹配,只要求他們儘可能靠譜,中間有幾個單詞是沒啥問題的,那就可以用到 slop。slop = 2 表示中間如果間隔 2 個單詞以內也算是匹配的結果()。
- 實也不能稱作間隔,應該說是移位,查詢的關鍵字分詞後移動多少位可以跟 doc 內容匹配,移動的次數就是 slop。所以 吉利 其實也是可以匹配到 doc 的,只是 slop = 1 才行。
GET /product_index/product/_search { "query": { "match_phrase": { "product_name" : { "query" : "吉利", "slop" : 1 } } } }
range用法
range用於查詢數值,時間區間
GET /product_index/product/_search { "query": { "range": { "price": { "gte": 30.00 } } } }