拋開細節不提,記住ES就是一個數據庫(只是整個數據庫有些特殊,話說回來,哪一個數據庫沒點本身的特色呢:) ),因此不少ES的中的概念咱們能夠類比普通的數據庫來幫助理解和記憶,爲了學習這個數據庫呢,咱們須要先了解幾個概念html
1、ES中幾個重要概念:java
索引:Index 注意不是luence中的索引的概念,至關於數據庫中的DataBase ,在ES中建一個索引,能夠類比爲在mysql中建立了一個databasemysql
類型:Type 至關於數據庫中的tablelinux
主鍵:id 至關於數據庫中的主鍵sql
因此,向ES中存儲數據,就是往ES中的Index下的Type中存儲數據,數據格式爲JSON。數據庫
那麼如何對這個數據庫進行操做呢?建索引、存數據,查數據…… ES提供了多種方式:如RESTFul風格api、java api等。json
2、RESTFul風格APIapi
這種方式就是經過http形式發送請求,對ES進行操做。數組
接口URL格式:緩存
http://host_IP:9200/<Index>/<Type>/[<id>]
index和type必須提供,id是可選的,不提供es會自動生成。index、type將信息進行分層,利於管理。index能夠理解爲數據庫;type理解爲數據表;id至關於數據庫表中記錄的主鍵,是惟一的。
查詢的請求方式 GET
#在linux中經過curl的方式查詢 curl -XGET 'http://192.168.10.18:9200/store/books/1'
# 經過_source獲取指定的字段 curl -XGET 'http://192.168.10.16:9200/store/books/1?_source=title' curl -XGET 'http://192.168.10.16:9200/store/books/1?_source=title,price' curl -XGET 'http://192.168.10.16:9200/store/books/1?_source'
刪除 DELETE
#刪除一個文檔 curl -XDELETE 'http://192.168.10.16:9200/store/books/1'
添加 PUT/POST
#向store索引中添加一些書籍,若是數據已經存在,會經過覆蓋的方式對數據進行更新 curl -XPUT 'http://192.168.10.16:9200/store/books/1' -d '{ "title": "Elasticsearch: The Definitive Guide", "name" : { "first" : "Zachary", "last" : "Tong" }, "publish_date":"2015-02-06", "price":"49.99" }'
修改 PUT/POST
#能夠經過覆蓋的方式更新 curl -H "Content-Type: application/json" -XPUT 'http://192.168.10.16:9200/store/books/1' -d '{
"title": "Elasticsearch: The Definitive Guide", "name" : { "first" : "Zachary", "last" : "Tong" }, "publish_date":"2016-02-06", "price":"99.99" }' # 或者經過 _update API的方式單獨更新你想要更新的 curl -XPOST 'http://192.168.10.16:9200/store/books/1/_update' -d '{ "doc": { "price" : 88.88 } }'
建立索引
#建立索引名字叫news curl -XPUT http://192.168.100.211:9200/news
爲索引建立mapping
建立mapping(至關於數據中的schema信息,約束type表名和字段名以及字段的類型)
curl -XPOST http://192.168.100.211:9200/news/fulltext/_mapping -d' { "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" } } }'
curl -XPUT 'https://192.168.100.211:9200/iktest?pretty' -d '{ "settings" : { "analysis" : { "analyzer" : { "ik" : { "tokenizer" : "ik_max_word" } } } }, "mappings" : { "article" : { "dynamic" : true, "properties" : { "subject" : { "type" : "string", "analyzer" : "ik_max_word" } } } } }'
添加文本內容
curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/1 -d' {"content":"美國留給伊拉克的是個爛攤子嗎"}' curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/2 -d' {"content":"公安部:各地校車將享最高路權"}' curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/3 -d' {"content":"中韓漁警衝突調查:韓警平均天天扣1艘中國漁船"}' curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/4 -d' {"content":"中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"}' curl -H "Content-Type: application/json" -XPOST http://192.168.1.2371:9200/news/fulltext/_search -d' { "query" : { "match" : { "content" : "中國" }}, "highlight" : { "pre_tags" : ["<font color='red'>", "<tag2>"], "post_tags" : ["</font>", "</tag2>"], "fields" : { "content" : {} } } }'
發起分詞請求
指定最大分詞或智能分詞
curl -XGET 'http://192.168.100.211:9200/_analyze?pretty&analyzer=ik_max_word' -d '聯想是全球最大的筆記本廠商' curl -XGET 'https://192.168.100.211:9200/_analyze?pretty&analyzer=ik_smart' -d '聯想是全球最大的筆記本廠商'
3、ES查詢
Hats off to the shares
做者:2zju
來源:CSDN
原文:https://blog.csdn.net/ifenggege/article/details/86103918
---------------------
做者:梧桐和風
來源:CSDN
原文:https://blog.csdn.net/wthfeng/article/details/53001218
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
-------------------------------------------------------------------------------------
準確來講,ES中的查詢操做分爲2種:查詢(query)和過濾(filter)。查詢便是以前提到的query查詢,它(查詢)默認會計算每一個返回文檔的得分,而後根據得分排序。而過濾(filter)只會篩選出符合的文檔,並不計算得分,且它能夠緩存文檔。因此,單從性能考慮,過濾比查詢更快。
換句話說,過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。通常應用時,應先使用過濾操做過濾數據,而後使用查詢匹配數據。
例如:
查詢16年10月以來全部內容含有「java」的文檔,先過濾剩下符合10月的文章,再精確匹配。
{ "query": { "filtered": { "query": { "range": { "date": { "lte": "2016-10-01" } } }, "filter": { "match": { "contents": "ES" } } } } }
過濾查詢包含filtered關鍵字,裏面又包含普通的查詢query邏輯和filter 過濾邏輯。運行時先執行過濾語句,後執行普通查詢。對比下面只使用了查詢的DSL,二者返回結果相同
{ "query": { "bool":{ "must":[{ "range":{ "date":{ "lte":"2016-10-01" } } },{ "match":{ "contents":"ES" } }] } } }
3-1 term query 和 terms query
term至關於=
查詢的字段只有一個值的時候,應該使用term而不是terms,在查詢字段包含多個的時候才使用terms,使用terms語法,json中必須包含數組。
match在匹配時會對所查找的關鍵詞進行分詞,而後按分詞匹配查找,而term會直接對關鍵詞進行查找。通常模糊查找的時候,多用match,而精確查找時能夠使用term
3-2 match query
match至關於like
一、match
二、match_all
三、multi_match 多字段查詢
若是想要再一個搜索中查詢多個字段,好比使用一個查詢關鍵字同時在title和summery中查詢,能夠使用multi_match查詢。
#name和author都必須包含Guide,而且價錢等於33.99或者188.99 curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "bool": { "must": { "multi_match": { "operator": "and", "fields": [ "name", "author" ], "query": "Guide" } }, "filter": { "terms": { "price": [ 35.99, 188.99 ] } } } } }'
3-3 bool query
bool查詢包含must,should,must_not,用於鏈接多個查詢條件
格式以下:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
must: 條件必須知足,至關於 and
should: 條件能夠知足也能夠不知足,至關於 or
must_not: 條件不須要知足,至關於 not
SELECT * FROM books WHERE (price = 35.99 OR price = 99.99) AND publish_date != "2016-02-06"
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query" : { "bool" : { "should" : [ { "term" : {"price" : 35.99}}, { "term" : {"price" : 99.99}} ], "must_not" : { "term" : {"publish_date" : "2016-02-06"} } } } }'
3-1 term query 和 terms query 查詢的字段只有一個值得時候,應該使用term而不是terms,在查詢字段包含多個的時候才使用terms,使用terms語法,json中必須包含數組。 match在匹配時會對所查找的關鍵詞進行分詞,而後按分詞匹配查找,而term會直接對關鍵詞進行查找。通常模糊查找的時候,多用match,而精確查找時能夠使用term 3-2 match query 1、match 2、match_all 3、multi_match 多條件查詢 若是想要再一個搜索中查詢多個字段,好比使用一個查詢關鍵字同時在title和summery中查詢,能夠使用multi_match查詢。 3-3 bool query bool查詢包含四個子句,must,filter,should,must_not { "query": { "bool": { "must": [ { "term": { "_type": { "value": "age" } } }, { "term": { "account_grade": { "value": "23" } } } ] } } } { "bool":{ "must":{ "term":{"user":"lucy"} }, "filter":{ "term":{"tag":"teach"} }, "should":[ {"term":{"tag":"wow"}}, {"term":{"tag":"elasticsearch"}} ], "mininum_should_match":1, "boost":1.0 } }
{ "bool":{ "must":{ "term":{"user":"lucy"} }, "filter":{ "term":{"tag":"teach"} }, "should":[ {"term":{"tag":"wow"}}, {"term":{"tag":"elasticsearch"}} ], "mininum_should_match":1, "boost":1.0 } }
3-4 Filter
query和filter的區別:query查詢的時候,會先比較查詢條件,而後計算分值,最後返回文檔結果;而filter是先判斷是否知足查詢條件,若是不知足會緩存查詢結果(記錄該文檔不知足結果),知足的話,就直接緩存結果。
SELECT * FROM books WHERE price = 35.99
filtered 查詢價格是35.99的
# 返回的得分是1.0 curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "term": { "price": 35.99 } } } } }'
# 返回的得分是1.0 curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "constant_score": { "filter": { "term": { "price": 35.99 } } } } }'
# 返回的得分是0.0 curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "bool": { "filter" : { "term" : { "price" : 35.99 } } } } }'
指定多個值,or的關係
#指定多個值 curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query" : { "bool" : { "filter" : { "terms" : { "price" : [35.99, 99.99] } } } } }'
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query" : { "bool" : { "must": { "match_all": {} }, "filter" : { "terms" : { "price" : [35.99, 99.99] } } } } }'
3-5 嵌套查詢
# SELECT * FROM books WHERE price = 35.99 OR ( publish_date = "2016-02-06" AND price = 99.99 )
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "bool": { "should": [ { "term": { "price": 35.99 } }, { "bool": { "must": [ { "term": { "publish_date": "2016-02-06" } }, { "term": { "price": 99.99 } } ] } } ] } } }'
3-6 range範圍過濾
range範圍過濾
gt : > 大於
lt : < 小於
gte : >= 大於等於
lte : <= 小於等於
SELECT * FROM books WHERE price >= 10 AND price < 99
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{ "query": { "range" : { "price" : { "gte" : 10, "lt" : 99 } } } }
查詢結果字段:
_index
_type
_id
_score{}
hits:{}