ElasticSearch概念與基本api使用

@TOC

es的基礎概念

1.cluster(集群)

一個集群就是由一個或多個es節(jié)點組織在一起劳翰,它們共同持有整個的數(shù)據(jù)请祖,并一起提供索引和搜索功能,一個集群由一個唯一的名字標識穿肄,這個名字默認就是“elasticsearch”,多個節(jié)點使用這個名字加入集群年局、每個節(jié)點都有自己的名字,集群是通過集群的名字來加入一個集群的咸产。另外矢否,每一個集群節(jié)點都有它自己的名字。如上節(jié)中所講的脑溢,master僵朗、salve1、slave2等屑彻。

2.node(節(jié)點)

一個節(jié)點是集群中的一個es實例验庙,作為集群的一部分,它存儲你的數(shù)據(jù)社牲,參與集群的索引和搜索功能粪薛,和集群類似,一個節(jié)點也是由一個名字來標識搏恤,默認情況下违寿,不配置會使用隨機名稱,這個明早再會在啟動的時候賦予節(jié)點

3.Index(索引)

一個索引就是一個擁有相似特征的文檔集合(類似mysql的數(shù)據(jù)庫)熟空,一個索引由一個名字來標識藤巢,我們對索引中的文檔進行索引、搜索時都需要用到這個名字

4.type(類型)

一個索引中息罗,可以定義一個或多個類型掂咒,一個類型相當于索引的一個分類(類似myql的表)

5.document(文檔)

一個文檔是一個可被索引的基礎信息單元(類似表中的一行記錄),它是最小的存儲單元迈喉,比如說一個用戶的基本信息俏扩,一篇文章的數(shù)據(jù)等等,文檔以json格式來表示弊添。

6.Mapping(映射)

Mapping是對類型中的文檔中的每個字段進行預先定義數(shù)據(jù)類型等功能录淡,如定義文檔中的某個字段為整形,使用什么分析器油坝,是否可搜索等嫉戚,一個索引可以定義多個mapping

7.Shards (分片)

Shard代表索引分片刨裆,es可以把一個完整的索引分成多個分片保存到不同的節(jié)點上,這樣的好處是可以把一個大的索引拆成多個彬檀,分布到不同的節(jié)點上帆啃,構成分布式搜索,分片的數(shù)量只能在索引創(chuàng)建前指定窍帝,索引創(chuàng)建或不能修改

8.Replicas(副本)

代表索引副本努潘,es可以對一個分片設置多個副本,副本的作用是提高系統(tǒng)的容錯性坤学,當每個節(jié)點某個分片損壞或丟失時可以從副本中恢復疯坤,二是提供es的搜索效率,es會對搜索請求進行負載均衡深浮。

當一個主分片失敗或者出現(xiàn)問題時压怠,代替的分片就會代替其工作,從而提高了es的可用性飞苇,那么備份的分片還可以支持搜索操作菌瘫,以分攤搜索的壓力。es在創(chuàng)建索引時布卡,會創(chuàng)建5個分片雨让,一份備份,這個數(shù)量是可以修改的忿等,備份是可以動態(tài)修改的宫患。

物理設計

一個人就是一個集群

es在后臺把每個索引劃分成多個分片,每份分片可以在集群中的不同服務器間遷移这弧。
一個人就是一個集群!默認的集群名稱就是elasticsearch虚汛。


一個人就是一個集群.png

節(jié)點和分片如何工作

默認分片是5個匾浪,創(chuàng)建副本是1個,意思就是我們存的數(shù)據(jù)通過這個分片可以搭到不同的節(jié)點上卷哩,一個集群至少有一個節(jié)點蛋辈,而一個節(jié)點就是一個es進程,節(jié)點可以有多個索引默認的将谊,如果你創(chuàng)建索引冷溶,那么索引將會有5個分片(primary shard,又稱為主分片)構成的尊浓,每一個主分片會有一個副本(replica shard,又稱復制分片)如下:


默認分片和副本數(shù).png

下圖是一個有3個節(jié)點的集群逞频,可以看見主分片和對應的副本分片都不會在同一節(jié)點內(nèi),這樣的好處在于某一個節(jié)點掛了栋齿,數(shù)據(jù)不至于丟失苗胀。實際上襟诸,一個分片是一個Lucene索引,一個包含倒排索引的文件目錄基协,倒排索引的結構使得es在不掃描全部文檔的情況下歌亲,就能告訴你哪些文檔包含特定的關鍵詞。

es集群示例.png

ElasticSearch VS Solr

  • Solr 利用 Zookeeper 進行分布式管理澜驮,而 Elasticsearch 自身帶有分布式協(xié)調(diào)管理功能;
  • Solr 支持更多格式的數(shù)據(jù)陷揪,而 Elasticsearch 僅支持json文件格式;
  • Solr 官方提供的功能更多杂穷,而 Elasticsearch 本身更注重于核心功能悍缠,高級功能多有第三方插件提供;
  • Solr 在傳統(tǒng)的搜索應用中表現(xiàn)好于 Elasticsearch亭畜,但在處理實時搜索應用時效率明顯低于 Elasticsearch扮休。
  • Solr 是傳統(tǒng)搜索應用的有力解決方案,但 Elasticsearch 更適用于新興的實時搜索應用拴鸵。

es的RESTFul API

  • API的基本格式http://<ip>:<port>/<索引>/<類型>/<文檔id>
  • 常用HTTP動詞GET/PUT/POST/DELETE

索引創(chuàng)建

索引的創(chuàng)建主要分結構化和非結構化創(chuàng)建

結構化創(chuàng)建

點擊索引->新建索引玷坠,輸入book,默認分片數(shù)為5劲藐,副本數(shù)為1八堡,然后再到概覽里面就可以看見我們創(chuàng)建的book索引了,粗線框是主分片聘芜,而細線框是粗線線框的備份分片兄渺。

非結構化創(chuàng)建

索引的創(chuàng)建分為結構化和非結構化,那么如何區(qū)分結構化和非機構化的呢汰现?在Head插件頁面上點擊信息->索引信息挂谍,可以看見一個關鍵詞mappings,這關鍵詞如果為空的瞎饲,那么就為非結構化的索引口叙。
創(chuàng)建結構化索引,在復合查詢中嗅战,輸入book/novel/_mappings妄田,指定json結構:

{
    "novel": {
        "properties": {
            "title": {
                "type": "text"
            }
        }
    }
}

提交一下請求,會顯示創(chuàng)建成功

{
    "acknowledged":true
}

然后再點擊首頁的索引信息驮捍,就可以看見mappings就不是空的了

"mappings":

postman模擬

采用postman提交索引的新建
PUT 127.0.0.1:9200/people

{
    "settings ": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "man": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "country": {
                    "type": "integer"
                },
                "age": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        },
        "woman": {

        }
    }
}

然后可以到head插件里面就可以看見剛才創(chuàng)建的people索引信息了

es的基本操作

插入

es的插入分為兩種疟呐,指定文檔id插入和自動產(chǎn)生文檔id插入

指定文檔id插入

我們在postman中插入:
PUT 127.0.0.1:9200/people/man/1
Body

{
    "name": "keweizhou",
    "country": "china",
    "age": 30,
    "date": "1987-03 -07"
}
  • head插件里面的docs代表所有文檔值
  • 點擊head里面的數(shù)據(jù)瀏覽就可以看見我們剛才插入的值了

自動產(chǎn)生文檔id插入

不加id采用POST方式提交,es默認會自己幫你生成一個id东且,而不是我們指定的那個id

修改

指定文檔id修改文檔

針對文檔id為1的進行修改
POST 127.0.0.1:9200/people/man/1/_update
body

{
    "script": {
        "lang": "painless",
          "inline":"ctx._source.age+=10"
    }
}

還可以通過參數(shù)的形式修改數(shù)據(jù)启具,如

{
    "script": {
        "lang": "painless",
        "inline": "ctx._source.age+=params.age",
        "params": {
            "age": 100
        }
    }
}

然后我們?nèi)ead插件里面就可以看見修改的數(shù)據(jù)了
ctx代表es的上下文,._source代表es的文檔

刪除

刪除文檔

進入postman珊泳,調(diào)用:DELETE 127.0.0.1:9200/people/man/1

刪除索引

刪除索引有兩種方法

  • 在head插件里面富纸,動作下面有個刪除的按鍵囤踩,然后點擊刪除,就可以將其刪除了
  • 或者在postman中調(diào)用 DELETE 127.0.0.1:9200/people晓褪,就可以將索引刪除了

查詢

簡單查詢

通過id為1查詢當條記錄:GET 127.0.0.1:9200/book/novel/1

條件查詢

POST 127.0.0.1:9200/book/_serarch
查詢所有的數(shù)據(jù)堵漱,body為:

{
    "query": {
        "match_all": {}
    }
}

查詢標題為elasticsearch的書籍:

{
    "query": {
        "match": {
            "title": "elasticserarch"
        }
    }
}

也可以在后面加上條件限制

"from":1,
"size":1

指定排序字段和排序類型(默認升序排列的):

{
    "sort": [{
        "publish_date": {
            "order": "desc"
        }
    }]
}

聚合查詢

aggs是聚合查詢的關鍵詞,可以按照這些字段進行聚合統(tǒng)計

{
    "aggs": {
        "group_by_word_count": {
            "terms": {
                "field": "word_count"
            }
        },
        "group_by_publish_date": {
            "terms": {
                "field": "publish_date"
            }
        }
    }
}

對word_count進行數(shù)學計算

{
    "aggs": {
        "grades_word_count": {
            "stats": {
                "field": "word_count"
            }
        }
    }
}

也可以將stats換成min涣仿、max等等進行數(shù)學計算

高級查詢

子條件查詢(葉子條件查詢)

特定字段查詢所指特定值勤庐,它可以分為Query context和Filter context

Query context

在查詢過程中,除了判斷文檔是否滿足查詢條件外好港,ES還會計算一個_score來標識匹配的程度愉镰,旨在判斷目標文檔和查詢條件匹配的有多好。
常用查詢分為全文本查詢和字段級別查詢
普通字段匹配找出作者是keweizhou的用戶钧汹,但是用到習語就會有問題丈探,比如我查詢java開發(fā)這個習語,就會把所有和java以及開發(fā)的都找出來拔莱,那么這個就不行了碗降,要將match換成match_phrase
POST 127.0.0.1:9200/book/_search

{
    "query": {
        "match": {
            "author": "keweizhou"
        }
    }
}

查詢習語

{
    "query": {
        "match_parase": {
            "title": "java開發(fā)"
        }
    }
}
  • 全文本查詢: 針對文本類型數(shù)據(jù)
  • 字段級別查詢: 針對結構化數(shù)據(jù),如數(shù)字塘秦,日期等

復合查詢是以一定邏輯組合子條件查詢讼渊,如:
查詢author和title字段中包含張三的數(shù)據(jù),語法查詢經(jīng)常在kibana中用
POST 127.0.0.1:9200/book/_search

{
    "query": {
        "multi_match": {
            "query": "張三",
            "fields": ["author", "title"]
        }
    }
}

語法查詢
POST 127.0.0.1:9200/book/_search
查詢出Elasticsearch和大法的信息

{
    "query": {
        "query_string": {
            "query": "Elasticsearch AND 大法"
        }
    }
}

查詢Elasticsearch和大法或者Python相關的

{
    "query": {
        "query_string": {
            "query": "(Elasticsearch AND 大法) OR Python"
        }
    }
}

利用query_string查詢多個字段:

{
    "query": {
        "query_string": {
            "query": "張三 OR Elasticsearch",
            "fields": ["title", "author"]
        }
    }
}

結構化查詢(按照一些字段的查詢):
POST 127.0.0.1:9200/book/_search
如查詢word_count字段等于1000的信息

{
    "query": {
        "term": {
            "word_count": 1000
        }
    }
}

查詢書籍字數(shù)(word_count)在1000~2000之間的

{
    "query": {
        "range": {
            "word_count": {
                "gte": 1000,
                "lte": 2000
            }
        }
    }
}

注意: 其中的e代表equals的意思尊剔,>=或者<=中的等于爪幻,它還可以用于日期類型上

Filter context

在查詢過程中,只判斷該文檔是否滿足條件须误,只有Yes或者No挨稿,主要是做數(shù)據(jù)過濾的,將符合條件的數(shù)據(jù)過濾出來京痢。
POST 127.0.0.1:9200/book/_search

{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "word_count": 1000
                }
            }
        }
    }
}
復合條件查詢

常用查詢?yōu)楣潭ǚ謹?shù)查詢奶甘、布爾查詢

固定分數(shù)查詢

POST 127.0.0.1:9200/_search
boot為指定分數(shù)為2,最后查詢出來的score都是2

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "title": "ElasticSearch"
                }
            },
            "boot": 2
        }
    }
}

should是一個或的關系历造,只要滿足其中的一個就行了。如何想要得到與的關系船庇,那么必須將should關鍵詞換成must

{
    "query": {
        "bool": {
            "should": [{
                    "match": {
                        "author": "張三"
                    }
                },
                {
                    "match": {
                        "title": "ElasticSearch"
                    }
                }
            ]
        }
    }
}

還可以配合著filter一起使用吭产,如:

{
    "query": {
        "bool": {
            "must": [{
                    "match": {
                        "author": "張三"
                    }
                },
                {
                    "match": {
                        "title": "ElasticSearch"
                    }
                }
            ],
            "filter": [{
                "term": {
                    "word_count": 1000
                }
            }]
        }
    }
}

它還有一個關鍵詞就是must_no,它的意識和must正好想法鸭轮,代表的意思就是一定不相等的意思臣淤。


圖文與內(nèi)容無關

參考: https://github.com/nuptkwz/notes/tree/master/technology/elasticsearch

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窃爷,隨后出現(xiàn)的幾起案子邑蒋,更是在濱河造成了極大的恐慌姓蜂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件医吊,死亡現(xiàn)場離奇詭異钱慢,居然都是意外死亡,警方通過查閱死者的電腦和手機卿堂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門束莫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人草描,你說我怎么就攤上這事览绿。” “怎么了穗慕?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵饿敲,是天一觀的道長。 經(jīng)常有香客問我逛绵,道長怀各,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任暑脆,我火速辦了婚禮渠啤,結果婚禮上,老公的妹妹穿的比我還像新娘添吗。我一直安慰自己沥曹,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布碟联。 她就那樣靜靜地躺著妓美,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤孵。 梳的紋絲不亂的頭發(fā)上壶栋,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音普监,去河邊找鬼贵试。 笑死,一個胖子當著我的面吹牛凯正,可吹牛的內(nèi)容都是我干的毙玻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼廊散,長吁一口氣:“原來是場噩夢啊……” “哼桑滩!你這毒婦竟也來了?” 一聲冷哼從身側響起允睹,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤运准,失蹤者是張志新(化名)和其女友劉穎幌氮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胁澳,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡该互,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了听哭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慢洋。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陆盘,靈堂內(nèi)的尸體忽然破棺而出普筹,到底是詐尸還是另有隱情,我是刑警寧澤隘马,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布太防,位于F島的核電站,受9級特大地震影響酸员,放射性物質(zhì)發(fā)生泄漏蜒车。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一幔嗦、第九天 我趴在偏房一處隱蔽的房頂上張望酿愧。 院中可真熱鬧,春花似錦邀泉、人聲如沸嬉挡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庞钢。三九已至,卻和暖如春因谎,著一層夾襖步出監(jiān)牢的瞬間基括,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工财岔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留风皿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓匠璧,卻偏偏與公主長得像桐款,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子患朱,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容