1.背景
ES數據庫是非關係型數據庫
2.ES數據庫優點
1.存儲優化
內存中使用有限狀態機FST優化
本質上是前綴樹加上後綴樹的結合,利用這個數據結構可以把Term更節省內存地放置並查詢,它有着字典樹的查詢時間複雜度,但是由於做了後綴合併會更節約內存
傳統Bitmap優化
使用Bitmap來記錄文檔的Id,每個bit對應一個文檔,表示它是否存在。
2.聯合查詢優化
若要對多個term做聯合查詢,比如做AND來查詢,實際上便是聯合各個term產生的跳錶Skip-list做查詢
Term Query中使用AND操作就是利用跳錶來做聯合查詢。比如搜索Term爲Address中同時包含關鍵字Road和District的文章,就可以找到二者的倒排然後選取短的序列用作遍歷,長的用作構造跳錶,隨後只要遍歷短的列表裏的文章逐個去跳錶裏尋找就可以了
3.算法
ES數據庫中集成了數據分析器Analyzer,例如Charater Filter(特殊字符替換) -> Tokenizer(分詞) -> Token Filter(每個詞處理)
在數據分析,自然語言處理中非常常見
4.ES數據庫集羣化,分片,主從備份機制,容災能力
3.ES數據庫缺點
1.浪費空間
由於ES數據庫採用文檔Id分佈,當文檔很稀疏時,將會很浪費空間
4.ES數據庫restful操作
域名:127.0.0.1:9200
操作的index: twitter
注意如果index未定義mapping,會根據你當前的數據結構,自動定義mapping,
1.根據_id寫入數據,如果存在則無法寫入
PUT twitter/_create/1
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
2. 根據_id更新數據或寫入數據(不會報錯,整體更新)
PUT twitter/_doc/1?timeout=5m
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
timeout=5m 這裏設置超時操作
3.增量式寫入數據(自動將生成隨機_id)
POST twitter/_doc/
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
4.根據_id查詢數據
GET twitter/_doc/0?_source=false
_source=false 表示將數據屏蔽調
_source_includes=message,post_date 表示加載的數據資源
GET twitter/_source/1?_source_includes=message,post_date
_source_includes=message,post_date 表示加載的數據資源
5.根據_id刪除數據
DELETE /twitter/_doc/1?timeout=5m
6.更新數據中某字段
POST /twitter/_update/1
{
"doc" : {
"user" : "lijiacai",
"age": 12
},
"detect_noop": false,
"doc_as_upsert" : true
}
"detect_noop": false 如果在發送請求之前name是new_name,那麼將忽略整個更新請求。如果請求被忽略,則響應中的result元素返回noop
doc_as_upsert: true 表示存在則更新該字段,不存在則插入
7.根據條件批量獲取數據
GET /twitter/_mget 或者 /twitter/_doc/_mget
其中_index 與url中的twitter對應,如果url未給出則參數中給出,反之url中給出,以下接口同理
{
"docs" : [
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1"
},
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "2"
}
]
}
8.根據條件批量篩選字段
GET /test/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2",
"_source" : {
"include": ["others"],
"exclude": ["others.name"]
}
}
]
}
include 包含字段
exclude 不包含字段
9.批量寫
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
注意這裏格式,是多級結構得字典,傳入參數是以換行符區分的
10.按條件刪除數據
POST twitter,other_index/_delete_by_query
{
"query": {
"match": {
"message": "some message"
}
}
}
可以給多個index表
11.根據條件查詢數據
POST /twitter/_search
{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
12.請求body查詢
其他參數見:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html
GET /twitter/_search
{
"query" : {
"term" : { "user" : "kimchy" }
}
}
13.查詢表結構
GET /twitter/_mapping
14.查詢集羣狀態
GET /_cluster/health
15.查詢index映射關係
GET /_cat/aliases?v
16.查詢集羣文檔數量
GET /_cat/count?v
17.query查詢URI
GET /twitter/_search?q=field: value
多個字段 使用AND 或者 OR
參數:
sort,from,size,q,_source等
詳情參照文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
18.查詢index的文檔數量
GET /twitter/_count?q=user:kimchy,