Elasticsearch介紹

簡介

Elasticsearch是一個(gè)高可擴(kuò)展的開源全文搜索和分析引擎,它允許存儲、搜索和分析大量的數(shù)據(jù),并且這個(gè)過程是近實(shí)時(shí)的。它通常被用作底層引擎和技術(shù),為復(fù)雜的搜索功能和要求提供動(dòng)力。

基礎(chǔ)概念

Elasticsearch中有幾個(gè)核心的概念,理解這些概念對于ES的學(xué)習(xí)還是很有幫助的。

近實(shí)時(shí)(Near Realtime NRT)

Elasticsearch是一個(gè)近實(shí)時(shí)的搜索平臺,近實(shí)時(shí)的意思是指從你建立索引到你能夠搜索這個(gè)文檔這個(gè)過程,這個(gè)過程時(shí)間大概是1秒鐘。

集群(Cluster)

一個(gè)集群包含一個(gè)或多個(gè)節(jié)點(diǎn)(node),用來保存全部數(shù)據(jù),并且這些節(jié)點(diǎn)聯(lián)合提供索引和搜索能力。集群使用唯一名稱進(jìn)行不同集群間的區(qū)分,默認(rèn)名稱是”elasticsearch”。集群的名稱很重要,因?yàn)橐粋€(gè)節(jié)點(diǎn)如果要加入到一個(gè)集群中,需要設(shè)置節(jié)點(diǎn)的集群名稱。
在實(shí)際應(yīng)用中,需要確保你的不同環(huán)境,所使用的名稱是不同的,否則會導(dǎo)致節(jié)點(diǎn)加入到其它集群環(huán)境中。比如你可以使用:logging-dev、logging-stage、logging-prod分別用來搭建開發(fā)、過渡、生產(chǎn)環(huán)境。
集群可以只有一個(gè)節(jié)點(diǎn),這個(gè)集群也能正常提供工作能力。此外,也可以搭建多個(gè)Elasticsearch集群,通過集群名稱區(qū)分。

節(jié)點(diǎn)(Node)

在集群中一個(gè)節(jié)點(diǎn)是一個(gè)單獨(dú)的服務(wù),用來存儲數(shù)據(jù),為集群的索引和搜索提供能力。集群中的節(jié)點(diǎn),也有唯一標(biāo)識的,默認(rèn)在節(jié)點(diǎn)啟動(dòng)的時(shí)候會隨機(jī)指定一個(gè)UUID(Universally Unique IDentifiter)。如果不使用默認(rèn)名稱,可以為其指定一個(gè)名稱。節(jié)點(diǎn)名稱對于集群管理也是很重要的。
一個(gè)節(jié)點(diǎn)要加入到指定集群,需要為節(jié)點(diǎn)指定集群名稱。默認(rèn)情況下,每個(gè)節(jié)點(diǎn)都設(shè)置集群名稱為”elasticsearch”,所以當(dāng)在同一網(wǎng)絡(luò)環(huán)境中,默認(rèn)啟動(dòng)一些節(jié)點(diǎn),這些節(jié)點(diǎn)會組裝成一個(gè)名為elasticsearch集群。

索引(Index)

一個(gè)索引包含許多特征類似的文檔。例如,有一個(gè)索引用來索引用戶數(shù)據(jù),另一個(gè)索引用來索引產(chǎn)品目錄,其它的索引可以索引其它數(shù)據(jù)。一個(gè)索引需要指定一個(gè)名稱(必須全部小寫),執(zhí)行索引、搜索、修改和刪除操作,需要指定對應(yīng)的索引名稱。
在一個(gè)集群中,你可以創(chuàng)建多個(gè)索引。

類型(Type)

在一個(gè)索引中,可以定義多個(gè)類型。一個(gè)類型可以管理索引中符合特定邏輯的一部分?jǐn)?shù)據(jù)。一般來說,類型定義具有公共字段的文檔。例如你想創(chuàng)建一個(gè)博客平臺,并且使用一個(gè)索引存儲所有數(shù)據(jù)。在這個(gè)索引中,你可以定義一個(gè)類型用來存儲用戶數(shù)據(jù),另一個(gè)類型用來存儲博客數(shù)據(jù),還可以創(chuàng)建一個(gè)類型用來存儲評論。

文檔(Documeng)

文檔是能夠被索引的基礎(chǔ)單元。例如一個(gè)文檔存儲一個(gè)用戶信息,另一個(gè)文檔存儲一個(gè)產(chǎn)品信息。Elasticsearch文檔使用JSON(JavaScript Object Notation)來表現(xiàn)數(shù)據(jù)。
在一個(gè)索引/文檔中可以存儲許多文檔。需要注意,盡管一個(gè)文檔在物理存儲上是存儲在一個(gè)索引中的,但文檔必須被索引或分配給索引的類型中。

分片(Shard)&副本(Replicas)

在實(shí)際應(yīng)用中可能存在這樣的場景,一個(gè)索引存儲超過了一個(gè)節(jié)點(diǎn)的物理存儲能力。例如一個(gè)索引有十億的文檔,超過了1TB的存儲,在單個(gè)節(jié)點(diǎn)無法完全存儲,并且對于單個(gè)節(jié)點(diǎn)的搜索請求是非常慢的。
為了解決這些問題,Elasticsearch提供了為索引切分成多個(gè)分片(Shard)的能力,當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候,你能夠定義索引被分割成多少個(gè)shard。每一個(gè)shard都是功能完全,能夠獨(dú)立索引的,可以分配到集群中任何一個(gè)節(jié)點(diǎn)中。

使用分片有兩個(gè)重要原因:

  • 允許水平分割文檔,分布存儲。
  • 允許你分配并且執(zhí)行分片,在多個(gè)節(jié)點(diǎn)中能夠提供查詢性能和吞吐量。

shard如何分布,當(dāng)一個(gè)請求發(fā)來后如何組織數(shù)據(jù),這些對于用戶來說都是透明的。
當(dāng)在一個(gè)網(wǎng)絡(luò)環(huán)境中,有可能某個(gè)節(jié)點(diǎn)或分片丟失。Elasticsearch提供了一種針對這種故障轉(zhuǎn)移的功能,就是副本。Elasticsearch允許你為一個(gè)分片創(chuàng)建一個(gè)或多個(gè)副本。分片和副本又稱為主/副分片。

使用副本有兩個(gè)重要原因:

  • 當(dāng)一個(gè)節(jié)點(diǎn)或分片丟失后,能夠繼續(xù)使用。因此,需要注意的是主/副分片不會存儲在一個(gè)節(jié)點(diǎn)中。
  • 當(dāng)進(jìn)行搜索的時(shí)候,允許搜索所有的副本,所以提高了搜索性能。

所以一個(gè)索引能夠分割成多個(gè)shard,一個(gè)索引能夠可以有零個(gè)或多個(gè)副本。每個(gè)索引都有主分片(索引切割后的分片,又稱原始分片)和副本分片(從原始分片復(fù)制過來的)。分片數(shù)量和副本數(shù)量在創(chuàng)建索引的時(shí)候可以被指定,當(dāng)索引創(chuàng)建后,可以指定改變副本數(shù)量,但是不能改變分片數(shù)量。默認(rèn)情況下每個(gè)索引在Elasticsearch有5個(gè)分片和1個(gè)副本,也就是說總共10個(gè)shard(副本是對分片來說的,每個(gè)shard又一個(gè)副本)。每一個(gè)shard內(nèi)部都是一個(gè)Lucene索引實(shí)例,單個(gè)lucene索引最多能夠存儲2,147,483,519(Integer.MAX_value-128)個(gè)文檔。

Elasticserach層級

理解Elasticsearch中索引、類型、文檔、域(字段)可以和關(guān)系型數(shù)據(jù)庫做個(gè)簡單的對比:

  • Relation DB: database->table->row->column
  • Elasticsearch:index->type->document->field

Elasticsearch安裝(5.2.0)

jdk安裝

Elasticsearch安裝前需要安裝jdk,版本最低是1.8,因?yàn)镋S源碼中許多使用了lambda表達(dá)式等jdk8的語法。

下載Elasticsearch

https://www.elastic.co/downloads/elasticsearch

解壓包

tar -zxvf elasticsearch-5.2.0.tar.gz
進(jìn)入解壓文件
cd elasticsearch-5.2.0/bin

啟動(dòng)ES

./elasticsearch
<pre>
2017-02-28T21:54:27,648][INFO ][o.e.n.Node ] [] initializing ...
[2017-02-28T21:54:27,736][INFO ][o.e.e.NodeEnvironment ] [fkHgUS8] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [117.6gb], net total_space [177.8gb], spins? [unknown], types [hfs]
[2017-02-28T21:54:27,736][INFO ][o.e.e.NodeEnvironment ] [fkHgUS8] heap size [1.9gb], compressed ordinary object pointers [true]
[2017-02-28T21:54:27,737][INFO ][o.e.n.Node ] node name [fkHgUS8] derived from node ID [fkHgUS8UTBOOYxQ4LaPYQg]; set [node.name] to override
[2017-02-28T21:54:27,739][INFO ][o.e.n.Node ] version[5.2.0], pid[4855], build[24e05b9/2017-01-24T19:52:35.800Z], OS[Mac OS X/10.11.6/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_91/25.91-b14]
[2017-02-28T21:54:28,453][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [aggs-matrix-stats]
[2017-02-28T21:54:28,453][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [ingest-common]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [lang-expression]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [lang-groovy]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [lang-mustache]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [lang-painless]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [percolator]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [reindex]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [transport-netty3]
[2017-02-28T21:54:28,454][INFO ][o.e.p.PluginsService ] [fkHgUS8] loaded module [transport-netty4]
[2017-02-28T21:54:28,455][INFO ][o.e.p.PluginsService ] [fkHgUS8] no plugins loaded
[2017-02-28T21:54:30,225][INFO ][o.e.n.Node ] initialized
[2017-02-28T21:54:30,225][INFO ][o.e.n.Node ] [fkHgUS8] starting ...
[2017-02-28T21:54:30,420][INFO ][o.e.t.TransportService ] [fkHgUS8] publish_address {127.0.0.1:9300}, bound_addresses {[fe80::1]:9300}, {[::1]:9300}, {127.0.0.1:9300}
[2017-02-28T21:54:33,477][INFO ][o.e.c.s.ClusterService ] [fkHgUS8] new_master {fkHgUS8}{fkHgUS8UTBOOYxQ4LaPYQg}{XitBFBRHSYKtMEA-VwIBgw}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2017-02-28T21:54:33,495][INFO ][o.e.h.HttpServer ] [fkHgUS8] publish_address {127.0.0.1:9200}, bound_addresses {[fe80::1]:9200}, {[::1]:9200}, {127.0.0.1:9200}
[2017-02-28T21:54:33,496][INFO ][o.e.n.Node ] [fkHgUS8] started
[2017-02-28T21:54:33,500][INFO ][o.e.g.GatewayService ] [fkHgUS8] recovered [0] indices into cluster_state
</pre>

從啟動(dòng)信息種可以看到節(jié)點(diǎn)名稱為fkHgUS8,由于是單節(jié)點(diǎn),所以本身就是master,使用端口9200作為REST API訪問端口。我們可以通過命令行為其指定集群名稱和節(jié)點(diǎn)名稱:
./elasticsearch -Ecluster.name=es_cluster -Enode.name=node01

探索集群

上面我們把elasticsearch集群啟動(dòng)起來了(雖然只有一個(gè)節(jié)點(diǎn)),接下來你應(yīng)該試著與這個(gè)集群進(jìn)行通信。Elasticsearch提供了非常全面和強(qiáng)大的REST API來與集群通信。通過這些API你可以:

  • 檢查集群、節(jié)點(diǎn)、索引健康、狀態(tài)和統(tǒng)計(jì)
  • 管理集群、節(jié)點(diǎn)、索引數(shù)據(jù)和元數(shù)據(jù)信息
  • 執(zhí)行CRUD操作
  • 執(zhí)行高級的搜索操作,比如分頁(paging)、排序(sorting)、腳本(scripting)、聚合(aggregations)和其它操作

Elasticsearch交互

Elasticsearch提供了兩種交互方式:java客戶端(java api)和http協(xié)議(rest api)

  1. java api
    節(jié)點(diǎn)客戶端(node client):節(jié)點(diǎn)客戶端加入集群,但是并不存儲數(shù)據(jù),但知道數(shù)據(jù)再集群的具體位置,并且能夠轉(zhuǎn)發(fā)請求到對應(yīng)節(jié)點(diǎn)上。
    傳輸客戶端(Transport client):節(jié)點(diǎn)本身不加入集群,只簡單發(fā)送請求給集群中的節(jié)點(diǎn),這個(gè)更輕量。
    兩個(gè)客戶端都是通過9300端口進(jìn)行訪問,并使用Elasticsearch傳輸協(xié)議進(jìn)行通信(ETP:Elasticsearch Transport Protocol),集群節(jié)點(diǎn)間也是使用9300端口進(jìn)行通信。
  2. 基于http協(xié)議
    基于HTTP協(xié)議,以JSON為數(shù)據(jù)交互格式的RESTful API,非java語言可以使用RESTful API形式與ES進(jìn)行交互,使用9200端口。
    請求格式:
    curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING> ‘ -d <BODY>
    VERB:HTTP方法,GET、POST、PUT、HEAD、DELETE
    PROTOCOL:http協(xié)議或https協(xié)議
    HOST:請求的節(jié)點(diǎn)主機(jī)
    PORT:端口號,默認(rèn)9200
    PATH:請求路徑
    QUERY_STRING:可選請求參數(shù)
    BODY:JSON形式請求的主題
    example:curl -XGET http://localhost:9200/_count
    得到響應(yīng)主體,如果要請求頭,在-XGET前加-i獲取

集群健康

集群健康檢查,這里會用到_cat語法:
curl http://127.0.0.1:9200/_cat/health?v

集群狀態(tài)

從結(jié)果可以看到,集群名稱為elasticsearch,集群狀態(tài)為綠色(green)。
集群狀態(tài)分為綠色(green)、黃色(yellow)和紅色(red)。

  • 綠色代表集群當(dāng)前狀態(tài)是好的(集群功能齊全)。
  • 黃色代表所有數(shù)據(jù)(主分片)都可用,但是一些副本(副分片)還沒有分配(集群功能齊全)。
  • 紅色代表一些數(shù)據(jù)(主分片)不可用。

需要注意的是,即使集群是紅色的,它仍然部分功能可用。例如:可用的shard能夠繼續(xù)為搜索提供服務(wù)。但是你應(yīng)該盡快去解決你丟失的數(shù)據(jù)。
從上面的信息來看,我們就有一個(gè)節(jié)點(diǎn)(node),并且可以看到有0個(gè)shard,這是因?yàn)槲覀冞€沒有導(dǎo)入數(shù)據(jù)。需要注意一點(diǎn),我們啟動(dòng)Elasticsearch使用默認(rèn)名稱elasticsearch。由于Elasticsearch默認(rèn)采用單播網(wǎng)絡(luò)去發(fā)現(xiàn)其它節(jié)點(diǎn),所以如果你啟動(dòng)了多個(gè)Elasticsearch實(shí)例,則會自動(dòng)加入這個(gè)名稱為”elasticsearch”的集群。

可以使用curl http://127.0.0.1:9200/_cat/nodes?v 查看node節(jié)點(diǎn)列表

node節(jié)點(diǎn)狀態(tài)

獲取所有索引列表
curl http://127.0.0.1:9200/_cat/indices?v

索引列表

會發(fā)現(xiàn)沒有任何索引紀(jì)錄,因?yàn)槲覀兗哼€沒有創(chuàng)建任何索引;
創(chuàng)建索引
curl -XPUT http://127.0.0.1:9200/customer

添加索引

然后在查看索引
curl http://127.0.0.1:9200/_cat?indices?v

索引列表

可以看到現(xiàn)在健康狀態(tài)為yello,之前我們說過yello說明當(dāng)前副本并未分配,因?yàn)槲覀冎挥幸粋€(gè)節(jié)點(diǎn),而副本不會和主分片在一臺機(jī)器上的,所以當(dāng)添加節(jié)點(diǎn)(node)后,副本分片被分配后集群恢復(fù)green。還可以看到有一個(gè)索引名稱為customer的索引,有5個(gè)主分片(pri)和1個(gè)副本分片(rep), 0個(gè)文檔,刪除過0個(gè)文檔,存儲大小,主分片存儲大小。

索引操作

索引文檔

索引文檔,需要為其指定類型,也可以為其手動(dòng)指定id(如果不指定,Elasticsearch隨機(jī)提供一個(gè)id)
curL -XPUT http://127.0.0.1:9200/customer/external/1?pretty -d '{"name":"yjz”}’
pretty參數(shù)是指格式化返回結(jié)果
返回結(jié)果:
<pre>
{
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
</pre>

需要注意的是,elasticsearch不需要你在索引文檔前提前創(chuàng)建索引或者類型。當(dāng)你索引文檔時(shí)候,如果發(fā)現(xiàn)索引不存在,則會自動(dòng)創(chuàng)建。

獲取索引

curL -XGET http://127.0.0.1:9200/customer/external/2?pretty
<pre>
{
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "Jok"
}
}
</pre>

能夠發(fā)現(xiàn)已經(jīng)找到該索引,_source字段是指索引時(shí)候的完整文檔。

刪除索引

curl -XDELETE http://127.0.0.1:9200/customer/external/2?pretty
<pre>
{
"found" : true,
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
}
}
</pre>

修改文檔

Elasticsearch表面上支持文檔的修改,其實(shí)底層是將舊的索引刪除,然后重新索引一個(gè)新的文檔,來實(shí)現(xiàn)修改功能。
curl -XPOST http://127.0.0.1:9200/customer/external/1?pretty -d '{"name":"Mark”}’
返回結(jié)果:
<pre>
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}
</pre>

批量操作

Elasticsearch提供了批量操作api(_bulk),來高效完成index、update、delete操作。批量操作可以將操作寫在一個(gè)文件中,然后在執(zhí)行命令的時(shí)候指定文件。
curl -XPOST 'http://10.4.237.77:9200/_bulk?pretty' --data-binary @esbatch.json
esbatch.json文件內(nèi)容:
<pre>
{"index":{"_index":"blog","_type":"article","_id":1}}
{"title":"java is first","conent":"java is verry nice"}
{"create":{"_index":"blog","_type":"article","_id":2}}
{"title":"elasticsearch","content":"elasticsearch study"}
{"create":{"_index":"blog","_type":"article","_id":2}}
{"title":"elasticsearchV2","conent":"elasticsearchV2"}
{"delete":{"_index":"blog","_type":"article","_id":4}}
{"delete":{"_index":"blog","_type":"article","_id":1}}
</pre>

批量操作不會因?yàn)橐粋€(gè)操作活動(dòng)(action)失敗而失敗,如果批量操作中有一條紀(jì)錄之行失敗,則批量操作還會繼續(xù)執(zhí)行。批量操作會為每個(gè)執(zhí)行活動(dòng)返回一個(gè)執(zhí)行狀態(tài),以便檢查是否執(zhí)行成功。

搜索

搜索可以使用兩種方式:REST request URI和REST request BODY,一些簡單搜索可以使用URI,而對于一些復(fù)雜的搜索可以使用request body。
curl -XGET http://127.0.0.1:9200/customer/_search?q=mark&sort=name:asc&pretty
返回結(jié)果:
<pre>
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Mark"
}
}
]
}
}
</pre>
返回說明:
took:Elasticsearch執(zhí)行搜索毫秒數(shù)
time_out:查詢是否超時(shí)
_shards:告訴我們搜索了多少個(gè)shard,成功多少,失敗多少。
hits:搜索結(jié)果
hits.total:總共多少個(gè)文檔符合我們的搜索條件
hits.max_score:匹配最大的分
hits.hits:實(shí)際搜索結(jié)果數(shù)據(jù)(默認(rèn)返回前十條)
Elasticsearch提供了JSON風(fēng)格的domain-specific-language(DSL:領(lǐng)域特定語言)執(zhí)行查詢,這種查詢語言是相當(dāng)全面的。比如:
curl -XGET http://127.0.0.1:9200/customer/_search?pretty -d '{"query":{"match_all":{}}}’,由于使用curl所以json串看著不友好
如果使用kibana或head,使用還是很有好的:
<pre>
GET /customer/_search
{
“query”:{“match_all”:{}},
“from”:10,
“size”:10,
“sort”:{“balance”:{“order”:”desc"}}
}
</pre>
如果想返回部分字段可以使用_source字段:
<pre>
GET /customer/_search
{
“query”:{“match_all”:{}},
“_source”:[“xxxx”,”xxxx"]
}
</pre>
上面都是match_all全部匹配返回,可以指定匹配條件,下面這個(gè)匹配包含hello或word的文檔。
<pre>
GET /customer/_search
{
“query”:{“match”:{“name”,”hello word"}}
}
</pre>
也可以匹配短語,就是包含hello word短語的文檔,不進(jìn)行拆詞。
<pre>
GET /customer/_search
{
“query”:{“match_phrase”:{“name”,”hello word"}}
}
</pre>

布爾查詢

布爾查詢可以多條件匹配,可以完成and、or、not組合條件查詢。

  • 查詢and操作,通過must控制,需要滿足所有查詢條件。

<pre>
GET /customer/_search
{
“query”:{
“must”:[
{“match”:{“name”:”hello”}},
{“match”:{“name”:”world"}}
]
}
}
</pre>

  • 查詢or操作,通過should控制,只需滿足部分查詢條件。

<pre>
GET /customer/_search
{
“query”:{
“should”:[
{“match”:{“name”:”hello”}},
{“match”:{“name”:”world"}}
]
}
}
</pre>

  • 查詢not操作,通過must_not控制,返回不包含條件列表的文檔。

<pre>
GET /customer/_search
{
“query”:{
“must_not”:[
{“match”:{“name”:”hello”}},
{“match”:{“name”:”world"}}
]
}
}
</pre>

  • 組合查詢條件

<pre>
GET /customer/_search
{
“query”:{
“must”:[
{“match”:{“name”:”hello”}}
],
“must_not”:[
{“match”:{“name”:”world"}}
]
}
}
</pre>

過濾條件

比如range范圍匹配
<pre>
GET /customer/_search
{
“query”:{
“must_not”:[
{“match”:{“name”:”hello”}},
{“match”:{“name”:”world"}}
],
“filter”:{
“range”:{
“balance”:{
“gte”:50,
“l(fā)te”:60
}
}
}
}
}
</pre>

聚合查詢

聚合可以將數(shù)據(jù)分組和統(tǒng)計(jì),Elasticsearch提供了聚合操作,聚合操作類似SQL中的group by語句。比如返回姓名相同的前十個(gè)(默認(rèn)返回十個(gè))
<pre>
GET /customer/_search
{
“size”:0,
“aggs”:{
“group_by_state”:{
“terms”:{
“field”:”name"
}
}
}
}
</pre>

Elasticsearch提供了近實(shí)時(shí)的數(shù)據(jù)操縱和搜索能力。默認(rèn)情況下從索引、修改、刪除到搜索出現(xiàn)在你結(jié)果中有1秒鐘的延遲,這是和其它平臺一個(gè)很大的區(qū)別,比如SQL數(shù)據(jù)操作完,立馬可見。

關(guān)注我

歡迎關(guān)注我的公眾號,會定期推送優(yōu)質(zhì)技術(shù)文章,讓我們一起進(jìn)步、一起成長!
公眾號搜索:data_tc
或直接掃碼:??


歡迎關(guān)注我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容