轉載原文:http://www.javashuo.com/article/p-ftyektsc-z.htmlhtml
該做者本系列文章,寫的很詳盡sql
=================================================================================數據庫
1. 關於索引
1.1 關於索引的一些基礎知識
在建立標準化索引的時候,咱們傳入的請求體以下:服務器
{ "settings":{ "number_of_shards":5, "number_of_replicas":1 }, "mappings":{ "novel":{ "properties":{ "id":{ "type":"integer" }, "book_name":{ "type":"text" }, "author":{ "type":"keyword" }, "brief_introduction":{ "type":"text" }, "publish_date":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd" }, "word_count":{ "type":"integer" } } } } }
首先,ElasticSearch的對象模型以下:數據結構
- 索引(Index):至關於數據庫,用於定義文檔類型的存儲;在同一個索引中,同一個字段只能定義一個數據類型;
- 文檔類型(Type):至關於關係表,用於描述文檔中的各個字段的定義;不一樣的文檔類型,可以存儲不一樣的字段,服務於不一樣的查詢請求;
- 文檔(Document):至關於關係表的數據行,存儲數據的載體,包含一個或多個存有數據的字段;
- 字段(Field):文檔的一個Key/Value對;
- 詞(Term):表示文本中的一個單詞;
- 標記(Token):表示在字段中出現的詞,由該詞的文本、偏移量(開始和結束)以及類型組成;
因此,上面的請求體咱們就能夠這樣標記:app
詳細的解釋下:ui
type:目前在6.0的時候,有keyword和text,區別爲:編碼
keyword:數據類型用來創建電子郵箱地址、姓名、郵政編碼和標籤等數據類型,不須要進行分詞。能夠被用來檢索過濾、排序和聚合。keyword 類型字段只能用自己來進行檢索。spa
text:Text 數據類型被用來索引長文本,這些文本會被分析,在創建索引前會將這些文本進行分詞,轉化爲詞的組合,創建索引。好比你配置了IK分詞器,那麼就會進行分詞,搜索的時候會搜索分詞來匹配這個text文檔。可是:text 數據類型不能用來排序和聚合3d
1.2 關於索引的自動建立禁止與否
在上篇博客中,咱們提到,當咱們插入數據的時候,若是有超出咱們結構化的數據的時候,索引會自動更新數據,可是不少時候會出現,不是同一我的操做的時候,插入的數據各式各樣的,最後致使索引沒法使用!如何解決?
dynamic屬性有三個值:
true:默認,能夠自動建立索引,插入數據字段不符合的話就建立新的索引。
false:不自動建立索引,當插入數據不符合默認屬性的時候,忽略新插入的不符合的字段的值。
strict:精確的,不容許插入不符合默認屬性的值,若是不符合,直接報錯。
咱們能夠在建立索引的時候,指定索引是絕對的,精確的,就能夠避免由於寫錯而更新了新的字段,以下圖:固然咱們也能夠設置當插入字段和咱們預先定義的映射不符的話,忽略這些新插入的字段,可是這樣的話後期查找問題可能會比較麻煩。
這樣的話,當你插入不符合標準化索引的時候,就會提示錯誤而致使沒法插入,固然這樣也有麻煩的地方,若是插入數據出錯,可能會致使數據丟失,因此若是在項目中你須要這樣作的話,最好能夠將失敗的數據寫入日誌文件或者直接寫入數據庫,這樣就能夠避免數據的丟失了,也能夠從新拿到失敗的數據進行從新索引。
1.3 關於文檔類型的屬性
文檔屬性定義了文檔類型的共用屬性,適用於文檔的全部字段。固然也能夠指定字段屬性,只適用於某個特定的字段。
- dynamic_date_formats屬性:該屬性定義能夠識別的日期格式列表;若是文檔中有多個字段都是時間格式,能夠通用的進行設置。
- dynamic屬性:默認爲true,容許動態地向文檔類型中加入新的字段。可選值爲:true,false,strict。上面已經介紹過了(詳見1.2.)。
1.4 關於文檔字段的屬性值
1.4.1 字段的數據類型
字段的數據類型由字段的屬性type指定,ElasticSearch支持的基礎數據類型主要有:
- 字符串類型:keyword和text。(在5.0以後更改,原來爲string)。詳細的介紹見1.1。
- 數值類型:字節(byte)、2字節(short)、4字節(integer)、8字節(long)、float、double;
- 布爾類型:boolean,值是true或false;
- 時間/日期類型:date,用於存儲日期和時間;
- 二進制類型:binary;
- IP地址類型:ip,以字符串形式存儲IPv4地址;
- 特殊數據類型:token_count,用於存儲索引的字數信息
1.4.2 字段的公共屬性:
- index:該屬性控制字段是否編入索引被搜索,該屬性共有三個有效值:analyzed、no和not_analyzed:store:指定是否將字段的原始值寫入索引,默認值是no,字段值被分析,可以被搜索,可是,字段值不會存儲,這意味着,該字段可以被查詢,可是不會存儲字段的原始值。
- analyzed:(默認屬性)表示該字段被分析,編入索引,產生的token能被搜索到;
- not_analyzed:表示該字段不會被分析,使用原始值編入索引,在索引中做爲單個詞;
- no:不編入索引,沒法搜索該字段;
- 其中analyzed是分析,分解的意思,默認值是analyzed,表示將該字段編入索引,以供搜索。
- boost:字段級別的助推,默認值是1,定義了字段在文檔中的重要性/權重;
- include_in_all:該屬性指定當前字段是否包括在_all字段中,默認值是ture,全部的字段都會包含_all字段中;若是index=no,那麼屬性include_in_all無效,這意味着當前字段沒法包含在_all字段中。
- copy_to:該屬性指定一個字段名稱,ElasticSearch引擎將當前字段的值複製到該屬性指定的字段中;
- doc_values:文檔值是存儲在硬盤上的索引時(indexing time)數據結構,對於not_analyzed字段,默認值是true,analyzed string字段不支持文檔值;
- fielddata:字段數據是存儲在內存中的查詢時(querying time)數據結構,只支持analyzed string字段;
- null_value:該屬性指定一個值,當字段的值爲NULL時,該字段使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,當一個字段設置爲NULL值,ElasticSearch引擎認爲該字段沒有任何值,使用該屬性爲NULL字段設置一個指定的值,使該字段可以被索引和搜索。
1.4.3 字符串類型經常使用的其餘屬性
- analyzer:該屬性定義用於創建索引和搜索的分析器名稱,默認值是全局定義的分析器名稱,該屬性能夠引用在配置結點(settings)中自定義的分析器;
- search_analyzer:該屬性定義的分析器,用於處理髮送到特定字段的查詢字符串;
- ignore_above:該屬性指定一個整數值,當字符串字段(analyzed string field)的字節數量大於該數值以後,超過長度的部分字符數據將不能被analyzer處理,不能被編入索引;對於 not analyzed string字段,超過長度的部分字符將被忽略,不會被編入索引。默認值是0,禁用該屬性;
- position_increment_gap:該屬性指定在相同詞的位置上增長的gap,默認值是100;
- index_options:索引選項控制添加到倒排索引(Inverted Index)的信息,這些信息用於搜索(Search)和高亮顯示:
- docs:只索引文檔編號(Doc Number)
- freqs:索引文檔編號和詞頻率(term frequency)
- positions:索引文檔編號,詞頻率和詞位置(序號)
- offsets:索引文檔編號,詞頻率,詞偏移量(開始和結束位置)和詞位置(序號)
- 默認狀況下,被分析的字符串(analyzed string)字段使用positions,其餘字段使用docs;
分析器(analyzer)把analyzed string 字段的值,轉換成標記流(Token stream),例如,字符串"The quick Brown Foxes",可能被分解成的標記(Token)是:quick,brown,fox。這些詞(term)是該字段的索引值,這使用對索引文本的查找更有效率。字段的屬性 analyzer 用於指定在index-time和search-time時,ElasticSearch引擎分解字段值的分析器名稱。
2. 關於請求方法
在使用ElasticSearch的時候,咱們會牽扯到不少的請求方法,好比GET,POST,PUT,DELETE等等,這些方法使用的都是Restful的調用風格,咱們來簡單介紹下這些方法
- GET 請求:獲取服務器中的對象
- 至關於SQL的Select命令
- GET /book 獲取全部的book信息
- POST 請求:在服務器上更新對象
- 至關於SQL的update命令
- POST /book/1 更新id爲1的book的信息
- PUT 請求:在服務器上建立對象
- 至關於SQL的create命令
- PUT /book/id 建立一個id爲xx的書
- DELETE 請求:刪除服務器中的對象HEAD 請求:僅僅用於獲取對象的基礎信息
- 至關於sql中的delete命令
- DELETE /book/1 刪除id爲1的書