添加測試數據java
PUT test_search { "mappings": { "test_type": { "properties": { "dname": { "type": "text", "analyzer": "standard" }, "ename": { "type": "text", "analyzer": "standard" }, "eage": { "type": "long" }, "hiredate": { "type": "date" }, "gender": { "type": "keyword" } } } } } POST test_search/test_type/_bulk {"index":{}} {"dname":"Sales Department","ename":"張三","eage":20,"hiredate":"2019-01-01","gender":"男性"} {"index":{}} {"dname":"Sales Department","ename":"李四","eage":21,"hiredate":"2019-02-01","gender":"男性"} {"index":{}} {"dname":"Development Department","ename":"王五","eage":23,"hiredate":"2019-01-03","gender":"男性"} {"index":{}} {"dname":"Development Department","ename":"趙六","eage":26,"hiredate":"2018-01-01","gender":"男性"} {"index":{}} {"dname":"Development Department","ename":"韓梅梅","eage":24,"hiredate":"2019-03-01","gender":"女性"} {"index":{}} {"dname":"Development Department","ename":"錢虹","eage":29,"hiredate":"2018-03-01","gender":"女性"}
search的參數都是相似http請求頭中的字符串參數提供搜索條件的node
GET [/index_name/type_name/]_search[?parameter_name=parameter_value&...]git
timeout參數:是超時時長定義。表明每一個節點上的每一個shard執行搜索時最多耗時多久。不會影響響應的正常返回。只會影響返回響應中的數據數量。spring
如:索引a中,有10億數據。存儲在5個shard中,假設每一個shard中2億數據,執行全數據搜索的時候,須要耗時1000毫秒。定義timeout爲10毫秒,表明的是shard執行10毫秒,搜索出多少數據,直接返回。數組
在商業項目中,是禁止全數據搜索的。必須指定搜索的索引,類型和關鍵字。若是沒有指定索引或類型,則表明開發目的不明確,須要從新作用例分析。若是沒有關鍵字,稱爲索引內全搜索,也叫魔鬼搜索。app
GET [索引名/類型名/]_search?timeout=10mselasticsearch
結果返回:ide
{ "took": 144, #請求耗時多少毫秒 "timed_out": false, #是否超時。默認狀況下沒有超時機制,也就是客戶端等待ElasticSearch搜索結束(不管執行多久),提供超時機制的話,ElasticSearch則在指定時長內處理搜索,在指定時長結束的時候,將搜索的結果直接返回(不管是否搜索結束)。指定超時的方式是傳遞參數,參數單位是:毫秒-ms。秒-s。分鐘-m。 "_shards": { "total": 1, #請求發送到多少個shard上 "successful": 1,#成功返回搜索結果的shard "skipped": 0, #中止服務的shard "failed": 0 #失敗的shard }, "hits": { "total": 1, #返回了多少結果 "max_score": 1, #搜索結果中,最大的相關度分數,相關度越大分數越高,_score越大,排位越靠前。 "hits": [ #搜索到的結果集合,默認查詢前10條數據。 { "_index": "test_index", #數據所在索引 "_type": "my_type", #數據所在類型 "_id": "1", #數據的id "_score": 1, #數據的搜索相關度分數 "_source": { # 數據的具體內容。 "field": "value" } } ] } }
所謂的multi-index就是從多個index中搜索數據。相對使用較少,只有在複合數據搜索的時候,可能出現。通常來講,若是真使用複合數據搜索,都會使用_all。spring-boot
如:搜索引擎中的無條件搜索。(如今的應用中都被屏蔽了。使用的是默認搜索條件,執行數據搜索。 如: 電商中的搜索框默認值, 搜索引擎中的類別)oop
無條件搜索,在搜索應用中稱爲「魔鬼搜索」,表明的是,搜索引擎會執行全數據檢索,效率極低,且對資源有很是高的壓力。
GET _search #搜索全部的索引
GET 索引名1,索引名2/_search # 搜索多個index中的數據
GET 索引名/類型名/_search # 所屬一個index中type的數據
GET prefix_*/_search # 通配符搜索
GET *_suffix/_search
GET 索引名1,索引名2/類型名/_search # 搜索多個index中type的數據
GET _all/_search # _all表明全部的索引
query string search 搜索是經過HTTP請求的請求頭傳遞參數的,默認的HTTP請求頭字符集是ISO-8859-1,請求頭傳遞中文會有亂碼。
GET 索引名/_search?q=字段名:搜索條件
默認狀況下,ElasticSearch搜索返回結果是10條數據。從第0條開始查詢
GET 索引名/_search?from=0&size=10 # from 從第幾行開始查詢,行號從0開始。
語法:
GET 索引名/_search?q=字段名:條件 #不加+/-默認使用的是+
GET 索引名/_search?q=+字段名:條件
GET 索引名/_search?q=-字段名:條件
+ :和不定義符號含義同樣,就是搜索指定的字段中包含keywords的數據,默認。
- : 與+符號含義相反,就是搜索指定的字段中不包含keywords的數據。
GET 索引名/_search?sort=字段名:排序規則
案例:
GET test_search/_search?sort=eage:asc
GET test_search/_search?sort=eage:desc
GET test_search/_search?sort=gender:desc,eage:desc
DSL - Domain Specified Language , 特殊領域的語言。
請求參數是請求體傳遞的。在ElasticSearch中,請求體的字符集默認爲UTF-8。
語法:
GET 索引名/_search { "command":{ "parameter_name" : "parameter_value"} }
GET 索引名/_search { "query" : { "match_all" : {} } }
全文檢索。要求查詢條件拆分後的任意詞條與具體數據匹配就算搜索結果。
GET 索引名/_search { "query": { "match": { "字段名": "搜索條件" } } }
短語檢索。要求查詢條件必須和具體數據徹底匹配纔算搜索結果。其特徵是:1-搜索條件不作任何分詞解析;2-在搜索字段對應的倒排索引(正排索引)中進行精確匹配,再也不是簡單的全文檢索。
GET 索引名/_search { "query": { "match_phrase": { "字段名": "搜索條件" } } }
範圍檢索
GET 索引名/類型名/_search { "query" : { "range" : { "字段名" : { "gt" : 搜索條件1, "lte" : 搜索條件2 } } } }
詞組搜索。忽略搜索條件分詞,在ElasticSearch倒排索引中進行精確匹配。
GET 索引名/類型名/_search { "query" : { "term" : { "字段名": "搜索條件" } } } GET 索引名/類型名/_search { "query" : { "terms" : { "字段名": ["搜索條件1", "搜索條件2"] } } }
GET 索引名/類型名/_search { "query": { "bool": { "must": [ #數組中的多個條件必須同時知足 { "range": { "字段名": { "lt": 條件 } } } ], "must_not":[ #數組中的多個條件必須都不知足 { "match": { "字段名": "條件" } }, { "range": { "字段名": { "gte": "搜索條件" } } } ], "should": [# 數組中的多個條件有任意一個知足便可。 { "match": { "字段名": "條件" } }, { "range": { "字段名": { "gte": "搜索條件" } } } ] } } }
在ElasticSearch的搜索中,默認是使用相關度分數實現排序的。能夠經過搜索語法實現定製化排序。
GET 索引名/類型名/_search { "query": { [搜索條件] }, "sort": [ { "字段名1": { "order": "asc" } }, { "字段名2": { "order": "desc" } } ] }
注意:在ElasticSearch中,若是使用text類型的字段做爲排序依據,會有問題。ElasticSearch須要對text類型字段數據作分詞處理。若是使用text類型字段作排序,ElasticSearch給出的排序結果未必友好,畢竟分詞後,先使用哪個單詞作排序都是不合理的。因此ElasticSearch中默認狀況下不容許使用text類型的字段作排序,若是須要使用字符串作結果排序,則可以使用keyword類型字段做爲排序依據,由於keyword字段不作分詞處理。
DSL分頁也是使用from和size實現的。
GET 索引名稱/_search { "query":{ "match_all":{} }, "from": 起始下標, "size": 查詢記錄數 }
在搜索中,常常須要對搜索關鍵字作高亮顯示,這個時候就可使用highlight語法。
GET 索引名/_search { "query": { "match": { "字段名": "條件" } }, "highlight": { "fields": { "要高亮顯示的字段名": { "fragment_size": 5, #每一個分段長度,默認20 "number_of_fragments": 1 #返回多少個分段,默認3 } }, "pre_tags": ["前綴"], "post_tags": ["後綴"] } }
案例:
GET test_search/_search { "query": { "bool": { "should": [ { "match": { "dname": "Development department" } }, { "match": { "gender": "男性" } } ] } }, "highlight": { "fields": { "dname": { "fragment_size": 20, "number_of_fragments": 1 }, "gender": { "fragment_size": 20, "number_of_fragments": 1 } }, "pre_tags": [ "<span style='color:red'>" ], "post_tags": [ "</span>" ] }, "from": 2, "size": 2 }
語法:
"aggs": { "NAME": {# 指定結果的名稱 "AGG_TYPE": {# 指定具體的聚合方法, TODO: # 聚合體內製定具體的聚合字段 } }, "NAME": {# 指定結果的名稱 "AGG_TYPE": {# 指定具體的聚合方法, TODO: # 聚合體內製定具體的聚合字段 } } }
源碼:cloud-es
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
#低版本使用5.x,注意使用的springdata的版本與es是否對應 spring.data.elasticsearch.cluster-name=es5-cluster spring.data.elasticsearch.cluster-nodes= hadoop208:9300,hadoop209:9300 #高版本使用6.x spring.elasticsearch.rest.uris=http://hadoop208:9200,http://hadoop209:9200
案例:Item對象
案例:ItemTest