在ES中使用的重點。ES中存儲的數據。核心就是爲了提供全文搜索能力的。搜索功能很是重要。多練。
php
1 query string search
search的參數都是相似http請求頭中的字符串參數提供搜索條件的。
GET [/index_name/type_name/]_search[?parameter_name=parameter_value&...]
如: 全數據搜索。也就是沒有搜索條件。
GET /test_index/my_type/_search
結果:java
{ "took": 8, # 執行的時長。單位毫秒。 "timed_out": false, # 是否超時 "_shards": { # shard 相關數據 "total": 5, # 總計多少個shard "successful": 5, # 成功返回結果的shard數量 "skipped": 0, "failed": 0 }, "hits": { # 搜索結果相關數據, "total": 3, # 總計多少數據,符合搜索條件的數據數量。 "max_score": 1, # 最大相關度分數。和搜索條件的匹配度。 "hits": [ # 具體的搜索結果 { "_index": "test_index", # 索引名稱 "_type": "my_type", # 類型名稱 "_id": "2", # id值 "_score": 1, # 匹配度分數,本條數據匹配度分數 "_source": { # 具體的數據內容,源 "name": "test_doc_02", "remark": "second test elastic search", "order_no": 2 } } ] } }
GET /index_name/type_name/_search?q=field_name:key_word&sort=field_name:order
如:
GET /test_index/my_type/_search?q=remark:test&sort=order_no:desc
結果:spa
{ "took":17, "timed_out":false, "_shards":{ "total":5, "successful":5, "skipped":0, "failed":0 }, "hits":{ "total":3, "max_score":null, "hits":[ { "_index":"test_index", "_type":"my_type", "_id":"3", "_score":null, "_source":{ "name":"test_doc_03", "remark":"third test elastic search", "order_no":3 }, "sort":[ 3 ] }, { "_index":"test_index", "_type":"my_type", "_id":"2", "_score":null, "_source":{ "name":"test_doc_02", "remark":"second test elastic search", "order_no":2 }, "sort":[ 2 ] }, { "_index":"test_index", "_type":"my_type", "_id":"1", "_score":null, "_source":{ "name":"test_doc_01", "remark":"first test elastic search", "order_no":1 }, "sort":[ 1 ] } ] } }
注意:此搜索操做通常只用在快速檢索數據使用,若是查詢條件複雜,很難構建query string。生產環境中不多使用。如:要求搜索條件爲商品名稱包含手機,價格在1000~5000之間,銷量在每個月500以上,根據價格升序排列,分頁查詢第二頁,每頁40條數據。
?q=xxxx:xxx&range=xxx:xxx:xxx&aggs&sort&from&size.net
2 query DSL
DSL - Domain Specified Language , 特殊領域的語言。blog
GET /index_name/type_name/_search { "commond":{ "parameter_name" : "parameter_value"} }
如:查詢全部數據排序
GET /test_index/my_type/_search { "query" : { "match_all" : {} } }
如:條件查詢,排序索引
GET /test_index/my_type/_search { "query" : { "match" : { "remark" : "test" } }, "sort" : [ { "order_no" : "asc" } ] }
如:分頁查詢ip
GET /test_index/my_type/_search { "query" : { "match_all" : {} }, "from" : 1, # 從第幾條數據開始查詢,從0開始計數 "size" : 2, # 查詢多少數據。 "sort" : [ { "order_no" : "asc" } ] }
如:查詢部分字段ci
GET /test_index/my_type/_search { "query": { "match": { "tags": "java" } }, "sort": [ { "age": { "order": "desc" } } ], "_source": ["name", "tags"], "from": 1, "size": 1 }
注意:此搜索操做適合構建複雜查詢條件,生產環境經常使用。rem
3 query filter
過濾查詢。此操做實際上就是query DSL的補充語法。過濾的時候,不進行任何的匹配分數計算,相對於query來講,filter相對效率較高。Query要計算搜索匹配相關度分數。Query更加適合複雜的條件搜索。
如:使用符合條件查詢。搜索tags中包含java字符串的數據,且年齡在20~25之間。
不使用filter, 年齡須要計算相關度分數GET /test_index/my_type/_search
{ "query": { "bool": { # 多條件搜索,內部的若干條件,只要有正確結果,便可。 "must": [ # 必須,內部若干條件,必須都匹配纔有結果 {"match": { # 匹配, 字段中必須匹配對應數據纔有結果 "tags": "java" }}, {"range": { # 範圍, 字段的數據必須知足某範圍纔有結果。 "age": { "gte": 20, # 比較符號 lt gt lte gte "lte": 25 } }} ] } } }
使用filter, 假設年齡不須要計算任何的相關度分數。
GET /test_index/my_type/_search { "query": { "bool": { # 多條件搜索,內部的若干條件,只要有正確結果,便可。 "must": [ # 必須,內部若干條件,必須都匹配纔有結果 {"match": { # 匹配, 字段中必須匹配對應數據纔有結果 "tags": "java" }}, {"range": { # 範圍, 字段的數據必須知足某範圍纔有結果。 "age": { "gte": 20, # 比較符號 lt gt lte gte "lte": 25 } }} ] } } }
4 full-text search
全文檢索。要求查詢條件拆分後的任意詞條與具體數據匹配就算搜索結果。查詢結果順序默認與匹配度分數相關。
搜索 tags中包含 java php .net的數據。
GET /test_index/my_type/_search { "query": { "match": { "tags": "java php .net sales" } } }
5 phrase search
短語檢索。要求查詢條件必須和具體數據徹底匹配纔算搜索結果。
GET /test_index/my_type/_search { "query": { "match_phrase": { "tags": "java developer" } } }
6 highlight display
高亮顯示。高亮不是搜索條件,是顯示邏輯。在搜索的時候,常常須要對條件實現高亮顯示。
GET /test_index/my_type/_search { "query": { "match": { "tags": "java sales developer" } }, "highlight": { "fields": { "tags": { "number_of_fragments": 1, "fragment_size": 1 } } } }