插入
- 指定文檔id 插入
以往people索引中的man文檔里插入數(shù)據(jù)為例
PUT方法
URL http://127.0.0.1:9200/people/man/1
json報文
{
"name": "monkey",
"country": "China",
"age": "18",
"date": "2000-10-01"
}
- 自動產(chǎn)生文檔id插入
以往people索引中的man文檔里插入數(shù)據(jù)為例
POST方法
URL: http://127.0.0.1:9200/people/man/
json報文
{
"name": "楊超越",
"country": "China",
"age": "20",
"date": "1999-10-01"
}
修改
- 直接修改文檔
修改man類型中id為1的文檔
POST 方法
URL: http://127.0.0.1:9200/people/man/1/_update
json 報文
{
"doc": {
"name": "齊天大圣"
}
}
- 通過腳本修改文檔
修改man類型中id為1的文檔
POST 方法
URL: http://127.0.0.1:9200/people/man/1/_update
關(guān)鍵字 script,es支持很多腳本語言,這里使用es內(nèi)嵌的腳本語言painless
, 在lang關(guān)鍵字中指定腳本語言,在inline關(guān)鍵字中寫腳本凡纳;ctx._source 指的是要修改文檔的上下文。
json報文:
{
"script": {
"lang": "painless",
"inline": "ctx._source.age = params.age",
"params" : {
"age": "500"
}
}
}
刪除操作
- 刪除文檔
DELETE方法
URL: http://127.0.0.1:9200/people/man/1 - 刪除索引
DELETE方法
URL: http://127.0.0.1:9200/people/
查詢
簡單查詢
GET方法
http://127.0.0.1:9200/book/novel/1
http://{ip}:{port}/<索引>/<類型>/<文檔id>
條件查詢
- 查詢所有數(shù)據(jù)
POST方法
http://127.0.0.1:9200/book/_search
json報文
{
"query": {
"match_all": {}
}
}
我們發(fā)現(xiàn)事秀,總共有12條數(shù)據(jù)惠呼,但是hits中默認只返回了10條滋早。
- 如何指定返回數(shù)據(jù)的條數(shù)以及從哪里返回呢恳守?from從第幾條開始返回考婴,size返回多少條。
{
"query": {
"match_all": {}
},
"from":1,
"size":1
}
- 指定關(guān)鍵詞查詢
我們查詢標題里有Elastic的書籍, match_all 改為match, title屬性為待查詢的關(guān)鍵字催烘。默認的排序是以_score字段倒序排列的
{
"query":{
"match": {
"title": "Elastic Search"
}
}
}
- 自定義排序
在sort中自定義排序沥阱。
{
"query":{
"match_all": {}
},
"sort": [
{
"publish_date": {
"order":"desc"
}
}
],
"size":15
}
聚合查詢
Elastic Search 中的聚合查詢和group by類似。聚合查詢的關(guān)鍵字是 aggs
- 單組聚合
{
"aggs":{
"group_by_word_count": { // 這個字段是自己自定義的
"terms": {
"field": "word_count" // 按照哪個字段進行聚合查詢
}
}
}
}
- 多條件聚合
{
"aggs":{
"group_by_word_count": {
"terms": {
"field": "word_count"
}
},
"group_by_publish_date": {
"terms": {
"field": "publish_date"
}
}
}
}
- 查詢某個字段的統(tǒng)計信息
stats是一個函數(shù)伊群,類似的還有min考杉,max等。
{
"aggs":{
"grades_word_count": {
"stats": {
"field":"word_count"
}
}
}
}
高級查詢
子條件查詢
特定字段查詢所有特定值
- QueryContext
在查詢過程中在岂,除了判斷文檔是否滿足查詢條件以外奔则,ES還會計算一個_score來標識匹配的程度蛮寂,旨在判斷目標文檔和查詢條件匹配的好壞程度蔽午。
常用查詢:
-
全文本查詢 針對文本類型數(shù)據(jù)
模糊匹配
{
"query": {
"match":{
"title":"Elastic Search入門"
}
}
}
查詢結(jié)果
{
"took": 19,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 4.3062487,
"hits": [
{
"_index": "book",
"_type": "novel",
"_id": "2",
"_score": 4.3062487,
"_source": {
"word_count": 3000,
"author": "瓦力",
"title": "Elastic Search入門",
"publish_date": "2017-03-12"
}
},
{
"_index": "book",
"_type": "novel",
"_id": "5",
"_score": 1.078649,
"_source": {
"word_count": 3000,
"author": "胖子瓦力",
"title": "精通Elastic Search",
"publish_date": "2017-12-01"
}
}
]
}
}
我們分析查詢結(jié)果可以看出,模糊匹配并不能去匹配整個詞語酬蹋。
習語匹配
習語匹配即完全匹配及老。
關(guān)鍵字 match_phrase
{
"query": {
"match_phrase":{
"title":"Elastic Search入門"
}
}
}
我們更改了關(guān)鍵字后,匹配的結(jié)果只剩下一條了:
{
"took": 22,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 5.384897,
"hits": [
{
"_index": "book",
"_type": "novel",
"_id": "2",
"_score": 5.384897,
"_source": {
"word_count": 3000,
"author": "瓦力",
"title": "Elastic Search入門",
"publish_date": "2017-03-12"
}
}
]
}
}
多字段匹配查詢
關(guān)鍵字 multi_match
{
"query":{
"multi_match":{
"query":"瓦力",
"fields":["author", "title"]
}
}
}
-
語法查詢 根據(jù)一定的語法規(guī)則進行的查詢范抓,支持通配符骄恶,范圍查詢,布爾查詢匕垫,正則表達式查詢僧鲁。
經(jīng)常用在Kibanna中
關(guān)鍵詞 query_string
{
"query":{
"query_string":{
"query":"(瓦力 AND Search) OR Spring Boot"
}
}
}
下面是查詢結(jié)果
{
"took": 5305,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 2.8850741,
"hits": [
{
"_index": "book",
"_type": "novel",
"_id": "2",
"_score": 2.8850741,
"_source": {
"word_count": 3000,
"author": "瓦力",
"title": "Elastic Search入門",
"publish_date": "2017-03-12"
}
},
{
"_index": "book",
"_type": "novel",
"_id": "11",
"_score": 1.2587122,
"_source": {
"word_count": 28000,
"author": "小馬哥",
"title": "精通Sping Boot編程思想",
"publish_date": "2019-01-17"
}
},
{
"_index": "book",
"_type": "novel",
"_id": "12",
"_score": 1.0346642,
"_source": {
"word_count": 21000,
"author": "翟超",
"title": "Spring Clound微服務實戰(zhàn)",
"publish_date": "2018-09-17"
}
},
{
"_index": "book",
"_type": "novel",
"_id": "9",
"_score": 0.9406741,
"_source": {
"word_count": 15000,
"author": "石濤",
"title": "Spring Boot2 企業(yè)開發(fā)實戰(zhàn)",
"publish_date": "2018-08-01"
}
}
]
}
}
語法查詢時,指定搜索的列
{
"query":{
"query_string":{
"query":"瓦力 AND Search",
"fields":["author","title"]
}
}
}
-
字段級別查詢 針對結(jié)構(gòu)化數(shù)據(jù)象泵,如數(shù)字寞秃、日期等
針對字段的查詢
{
"query": {
"term": {
"word_count": 3000
}
}
}
針對author字段查詢
{
"query": {
"term": {
"author": "瓦力"
}
}
}
針對某個字段范圍查詢,關(guān)鍵字 range:如word_count大于3000小于15000偶惠。
{
"query":{
"range":{
"word_count":{
"gte": 3000,
"lte": 15000
}
}
}
}
日期字段的范圍查詢:
{
"query":{
"range":{
"publish_date":{
"gte": "2017-01-01",
"lte": "now"
}
}
}
}
子條件查詢
Filter Context
在查詢過程中春寿,只判斷該文檔是否滿足條件,只有yes或者No忽孽。
而Query Context在查詢過程中绑改,還會判斷文檔匹配的有多好谢床,會有一個score字段來表示。
查詢1000字的書籍:
{
"query":{
"bool":{
"filter": {
"term":{
"word_count":1000
}
}
}
}
}
Filter會做數(shù)據(jù)過濾厘线,ES會對Filter的結(jié)果做緩存识腿,因此相對于query速度會快一些。
復合條件查詢
固定分數(shù)查詢
關(guān)鍵詞 constant_score
{
"query": {
"constant_score": {
"filter": {
"match":{
"title":"Elastic"
}
}
}
}
}
也可以使用boost指定分數(shù)
{
"query": {
"constant_score": {
"filter": {
"match":{
"title":"Elastic"
}
},
"boost":2
}
}
}
固定分數(shù)查詢不支持match
布爾查詢
表示或的條件
{
"query":{
"bool":{
"should":[{
"match":{
"author":"瓦力"
}
},
{
"match":{
"title":"Elastic"
}
}]
}
}
}
表達并且的關(guān)系
{
"query":{
"bool":{
"must":[{
"match":{
"author":"瓦力"
}
},{
"match":{
"title":"Elastic"
}
}]
}
}
}
添加filter過濾條件
{
"query":{
"bool":{
"must":[{
"match":{
"author":"瓦力"
}
},{
"match":{
"title":"Elastic"
}
}],
"filter":[{
"term":{
"word_count":3000
}
}]
}
}
}
表示非的語義
查詢作者不是瓦力的書:
{
"query":{
"bool":{
"must_not":{
"term":{
"author":"瓦力"
}
}
}
}
}