es數據庫查詢API

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,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章