【elasticsearch】關於elasticSearch的基礎概念瞭解【轉載】

轉載原文: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的書
相關文章
相關標籤/搜索