重慶建設(shè)工程管理網(wǎng)seo入門到精通
目錄
- elasticsearch基本概念
- RESTful API
- 創(chuàng)建非結(jié)構(gòu)化索引
- (增)創(chuàng)建空索引
- (刪)刪除索引
- (改)插入數(shù)據(jù)
- (改)數(shù)據(jù)更新
- (查)搜索數(shù)據(jù)(id)
- (查)搜索數(shù)據(jù)(全部)
- (查)關(guān)鍵字搜索數(shù)據(jù)
- (查)DSL搜索
- 其他(聚合)
elasticsearch基本概念
Elasticsearch 是一個分布式搜索引擎,用于全文搜索、分析和可視化大規(guī)模數(shù)據(jù)。以下是 Elasticsearch 中一些基本概念:
- 索引(Index):
- Elasticsearch 中的數(shù)據(jù)存儲單元,類似于傳統(tǒng)數(shù)據(jù)庫中的數(shù)據(jù)庫。每個索引包含一組相關(guān)的文檔。
- 文檔(Document):
- 索引中的基本信息單元,可以是 JSON、XML、或其他格式的數(shù)據(jù)。文檔是 Elasticsearch 中可被索引和搜索的基本數(shù)據(jù)單元。
- 類型(Type)(在7.x版本之前):
- Elasticsearch 6.x及更早版本中,索引可以包含一個或多個類型,每個類型定義了文檔的結(jié)構(gòu)。從 Elasticsearch 7.x 開始,不再支持多類型,一個索引只有一個默認(rèn)類型 “_doc”。
- 映射(Mapping):
- 定義了索引中的文檔結(jié)構(gòu),包括每個字段的類型和屬性。映射在創(chuàng)建索引時自動創(chuàng)建,也可以手動定義。
- 節(jié)點(Node):
- Elasticsearch 集群中的單個服務(wù)器,用于存儲數(shù)據(jù)和執(zhí)行數(shù)據(jù)操作。每個節(jié)點屬于一個集群,并且有唯一的名稱。
- 集群(Cluster):
- 由一個或多個節(jié)點組成的集合,共同存儲數(shù)據(jù)并提供聯(lián)合的搜索能力。集群有一個唯一的名稱。
- 分片(Shard):
- 索引可以被分割成多個分片,每個分片是一個獨立的索引。分片允許數(shù)據(jù)水平擴(kuò)展,提高并發(fā)性能。
- 副本(Replica):
- 每個分片可以有零個或多個副本。副本是分片的精確拷貝,用于提高高可用性和故障恢復(fù)。
- 查詢(Query):
- 用于搜索 Elasticsearch 中文檔的條件??梢酝ㄟ^查詢DSL(Domain Specific Language)來構(gòu)建各種類型的查詢。
- 聚合(Aggregation):
- 用于分析和統(tǒng)計數(shù)據(jù)的機(jī)制,可以計算平均值、總和、最小值等。
- 索引別名(Index Alias):
- 為索引提供一個可讀的名稱,可以用于簡化索引操作和在查詢中引用多個索引。
- 分析器(Analyzer):
- 用于在索引和查詢階段處理文本數(shù)據(jù)的組件,包括分詞、小寫化、去停用詞等。
- 倒排索引(Inverted Index):
- Elasticsearch 使用倒排索引來加速搜索,它記錄了每個詞項出現(xiàn)在哪些文檔中。
這些是 Elasticsearch 中一些基本的概念,了解它們有助于更好地理解和使用 Elasticsearch 進(jìn)行數(shù)據(jù)存儲和檢索。
RESTful API
在Elasticsearch中,提供了功能豐富的RESTful API的操作,包括基本的CRUD、創(chuàng)建索引、刪除索引等操作。
創(chuàng)建非結(jié)構(gòu)化索引
在Lucene中,創(chuàng)建索引是需要定義字段名稱以及字段的類型的,在Elasticsearch中提供了非結(jié)構(gòu)化的索引,就是不需要創(chuàng)建索引結(jié)構(gòu),即可寫入數(shù)據(jù)到索引中,實際上在Elasticsearch底層會進(jìn)行結(jié)構(gòu)化操作,此操作對用戶是透明的。
(增)創(chuàng)建空索引
PUT /elk
{"settings":{"index":{"number_of_shards":"2","number_of_replicas":"0"}}
}
這里我選擇postman進(jìn)行測試。
去elasticsearch-head看是否索引創(chuàng)建是否成功。
可以看到索引已經(jīng)創(chuàng)建成功了。
(刪)刪除索引
DELETE /elk
{"acknowledged": true
}
在postman中進(jìn)行刪除操作
檢查是否刪除成功
可以看到已經(jīng)刪除成功了
(改)插入數(shù)據(jù)
上面我們已經(jīng)學(xué)會了如何創(chuàng)建好刪除索引,現(xiàn)在我們進(jìn)行數(shù)據(jù)的添加操作。
URL規(guī)則:
POST /{索引}/{類型}/{id}
插入如下數(shù)據(jù)。
{
"id":1001,
"name":"王五",
"age":18,
"sex":"男"
}
postman中顯示插入成功了。
瀏覽器上是否也是插入成功呢?
可以看到數(shù)據(jù)已經(jīng)成功插入了。
(改)數(shù)據(jù)更新
在Elasticsearch中,文檔數(shù)據(jù)是不為修改的,但是可以通過覆蓋的方式進(jìn)行更新。
{
"id":1001,
"name":"王老五",
"age":55,
"sex":"男"
}
服務(wù)器中的數(shù)據(jù)也成功更新了。
問題與探究問題與探究問題與探究
可以看到數(shù)據(jù)已經(jīng)被覆蓋了。問題來了,可以局部更新嗎? – 可以的。前面不是說,文檔數(shù)據(jù)不能更新嗎?
其實是這樣的:在內(nèi)部,依然會查詢到這個文檔數(shù)據(jù),然后進(jìn)行覆蓋操作,步驟如下:
- 從舊文檔中檢索JSON
- 修改它
- 刪除舊文檔
- 索引新文檔
#注意:這里多了_update標(biāo)識POST /haoke/_update/1001
{
"doc":{
"age":66
}
}
可以看到數(shù)據(jù)已經(jīng)成功更新了。
我們需要id存在,否則會報錯,也就是404
當(dāng)id存在,我們可以往數(shù)據(jù)添加原先沒有的數(shù)據(jù)。
(查)搜索數(shù)據(jù)(id)
GET /elk/_doc/id
我們也可以直接在elasticsearch中進(jìn)行搜索
(查)搜索數(shù)據(jù)(全部)
GET /elk/_search
同樣的,查詢?nèi)恳部梢灾苯釉趀lasticsearch-head中的基本查詢中進(jìn)行搜索。
(查)關(guān)鍵字搜索數(shù)據(jù)
#格式
GET /elk/_search?q=字段名:對應(yīng)值#查詢年齡等于13的用戶
GET /elk/_search?q=age:20
#查詢年齡等于13的用戶
GET /elk/_search?q=address:湖南
(查)DSL搜索
Elasticsearch的DSL(Domain-Specific Language)是一種查詢語言,用于在Elasticsearch中執(zhí)行搜索操作。DSL允許用戶以結(jié)構(gòu)化的方式構(gòu)建復(fù)雜的查詢,以滿足不同的搜索需求。DSL查詢通常以JSON格式表示,并包含各種查詢和過濾條件。
以下是一些常見的DSL查詢語法和查詢類型的詳細(xì)解釋:
-
Match Query:
Match查詢用于執(zhí)行全文本搜索,它會在指定的字段中查找包含特定詞語的文檔。{"query": {"match": {"field_name": "search_term"}} }
匹配年齡為20的數(shù)據(jù)
POST /elk/_search #請求體 {"query" : {"match" : {"age" : 23}} }
匹配多個姓名數(shù)據(jù)
POST /elk/_search #請求數(shù)據(jù) {"query" : {"match" : {"name" : "張四 李三 王老五"}} }
高亮顯示
POST /elk/_search #請求數(shù)據(jù) {"query": {"match": {"name": "王老五"}},"highlight": {"fields": {"name": {}}} }
-
Term Query:
Term查詢用于匹配確切的詞語。它通常用于精確匹配,而不進(jìn)行全文本搜索。{"query": {"term": {"field_name": "exact_term"}} }
-
Bool Query: Bool查詢允許將多個查詢組合在一起,并使用邏輯運算符(must、must_not、should)來定義查詢邏輯。
{"query": {"bool": {"must": [{ "match": { "field1": "value1" } },{ "term": { "field2": "value2" } }],"must_not": [{ "range": { "field3": { "gte": "2022-01-01" } } }],"should": [{ "term": { "field4": "value3" } }]}} }
查詢年齡大于18歲的男性用戶。
POST /elk/user/_search #請求數(shù)據(jù) {"query": {"bool": {"filter": {"range": {"age": {"gt": 18}}},"must": {"match": {"sex": "男"}}}} }
-
Range Query:
Range查詢用于匹配指定范圍內(nèi)的值。{"query": {"range": {"field_name": {"gte": "min_value","lte": "max_value"}}} }
-
Wildcard Query:
通配符查詢允許使用通配符進(jìn)行模糊匹配。{"query": {"wildcard": {"field_name": "search*term"}} }
-
Nested Query:
Nested查詢用于在嵌套文檔中執(zhí)行查詢。{"query": {"nested": {"path": "nested_field","query": {"match": {"nested_field.property": "value"}}}} }
這些是一些基本的DSL查詢示例。在實際應(yīng)用中,可以將這些查詢類型組合使用,以滿足特定的搜索需求。此外,Elasticsearch還支持聚合(Aggregation)、排序(Sorting)、分頁(Pagination)等高級功能,可以進(jìn)一步擴(kuò)展查詢的能力。
其他(聚合)
在Elasticsearch中,支持聚合操作,類似SQL中的group by操作。
POST /elk/_search
{"aggs": {"all_interests": {"terms": {"field": "age"}}}
}