Elasticsearch基本知識

ES是一個(gè)基于Apache的開源索引庫Lucene而構(gòu)建的 開源、分布式、具有RESTful接口的全文搜索引擎, 還是一個(gè)分布式文檔數(shù)據(jù)庫.


一、基本概念

1.index:

索引是具有相似結(jié)構(gòu)的文檔的集合, 比如可以有一個(gè)商品分類索引, 訂單索引.

每個(gè)索引都要有唯一的名稱, 名稱要小寫, 通過索引名稱來執(zhí)行索引、搜索、更新和刪除等操作.

一個(gè)集群中可以有任意多個(gè)索引, 只要保證名稱不同即可

2.document

文檔是存儲在ES中的一個(gè)個(gè)JSON格式的字符串, 是ES索引中的最小數(shù)據(jù)單元, 由field(字段)構(gòu)成.

ES是一個(gè)非結(jié)構(gòu)化的數(shù)據(jù)庫,每個(gè)文檔可以有不同的字段,并且有一個(gè)唯一標(biāo)識.

3.field

字段可以是一個(gè)簡單的值(如字符串、數(shù)字、日期), 也可以是一個(gè)數(shù)組, 還可以嵌套一個(gè)對象或多個(gè)對象.

字段類似于關(guān)系數(shù)據(jù)庫中表數(shù)據(jù)的列, 每個(gè)字段都對應(yīng)一個(gè)類型.

可以指定如何分析某一字段的值, 即對field指定分詞器

4.type

一個(gè)索引中,可以定義一個(gè)或者多個(gè)類型(7.x版本中被廢棄,8.x版本中已移除)

5.text

文本是field類型的一種, 通常會被分析成多個(gè)Term, 存儲在ES的索引庫中.

6.mapping

類似于關(guān)系數(shù)據(jù)庫中的Table結(jié)構(gòu), 每個(gè)index都有一個(gè)映射: 定義索引中每個(gè)字段的類型.

所有文檔在寫進(jìn)索引之前都會先進(jìn)行分析, 如何對文本進(jìn)行分詞、哪些詞條又會被過濾, 這類行為叫做映射(mapping).

映射可以提前定義, 也可以在第一次存儲文檔時(shí)自動識別.

7.analysis

將文本轉(zhuǎn)換為索引詞的過程, 分析的結(jié)果依賴于分詞器

240015.jpg

二、基本原理
正排索引:通過記錄id查詢內(nèi)容記錄;

倒排索引:通過內(nèi)容關(guān)鍵詞獲取記錄id。ES寫入數(shù)據(jù)時(shí),會把數(shù)據(jù)進(jìn)行分詞,把每一個(gè)分詞的結(jié)果與文檔進(jìn)行關(guān)聯(lián),再把相同的詞所關(guān)聯(lián)的文檔進(jìn)行合并,建立倒排索引。

三、ES的字段
es的字段都有一個(gè)字段類型,不同的類型都各有所長,比如keyword類型的字段適合做聚合和排序,而text的類型可以用來全文搜索。下面按大類介紹下es常用的數(shù)據(jù)類型,es的數(shù)據(jù)字段的類型定義和搜索的方式緊密相關(guān),

例如 keyword類型,Number類型在搜索時(shí),只適合精準(zhǔn)匹配,范圍搜索之類的,不能用于全文搜索。而text類型適合全文搜索。



1.Common types

1.1 binary

二進(jìn)制類型 ,值以base64字符串的形式存貯,_source默認(rèn)不會存貯該類型的值,如果需要實(shí)際的存貯,請?jiān)O(shè)置 store屬性為true默認(rèn)是false

type:binary

PUT my-index-000003
{
  "mappings": {
    "properties": {

      "blob": {
        "type": "binary",
        "store": true
      }
    }
  }
}

PUT my-index-000003/_doc/2
{
  "blob": "U29tZSBiaW5hcnkgYmxvYg=="
}


1.1 boolean

布爾類型

type:boolean

true :true,“true"都可以表示 true

false: false,“false”,”" 都可以表示 false



PUT my-index-000003
{
  "mappings": {
    "properties": {

      "boolean_field": {
        "type": "boolean"
      }
    }
  }
}


PUT my-index-000003/_doc/2
{
  "boolean_field": "false"
}


1.2 Keywords

keywords大家庭包括 keyword,constant_keyword,widecard



keyword:類型的字段適合聚合(aggragate)和排序(sort)操作,term和term_level查詢比較快,如果字段的值都是數(shù)字,但term查詢比較多,可以考慮定義keyword類型,而不是interger或者其他數(shù)字類型,



constant_keyword:所有文檔的該字段的值都是一樣的,可以定義該類型



widecard:適合通配符搜索日志等場景 ,text類型不支持通配符搜索,但widecard 在聚合和排序的性能會低于其他keyword類型,而且如果前導(dǎo)詞是通配符,搜索效率相對會比較慢。



PUT my-index-000003/_mapping
{

    "properties": {
      "my_keyword":{
        "type": "keyword"
      },
      "my_constant_keyword":{
        "type": "constant_keyword",
        "value":"constant"
      },
      "my_wildcard": {
        "type": "wildcard"
      }
    }

}


PUT my-index-000003/_doc/1
{
  "my_keyword":"keyword",
  "my_wildcard" : "This string can be quite lengthy"
}


GET my-index-000003/_search
{
  "query": {
    "wildcard": {
      "my_wildcard": {
        "value": "*quite*"
      }
    }
  }
}


1.3 Numbers

數(shù)字類型:包括整數(shù)和浮點(diǎn)數(shù)類型,有 short,interger,long unsigned_long,

float,double,half_float,scaled_float(底層是以long類型存貯的,需要配置scaled_factor ,浮點(diǎn)數(shù)*scaled_factor,比如價(jià)格一般是2位小數(shù) ,如果scaled_factor配置為100 ,某個(gè)文檔的該類型字段的值為 98.99,那么底層存貯 9899,相對于直接存double,節(jié)約了存貯空間),不是該字段存的是數(shù)字類型就一定要定義數(shù)字類型,數(shù)字類型在range查詢,和一些數(shù)值計(jì)算查詢相對會快,但是如果是term查詢不如keyword類型。



PUT /my-index-000003/_mapping
{

    "properties": {
      "number_of_bytes": {
        "type": "integer"
      },
      "time_in_seconds": {
        "type": "float"
      },
      "price": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }

}


1.4 Dates

日期類型包括 date和date_nanos.類型,

date類型可以通過format屬性指定字段值的日期格式, || 連接多種格式

如果沒有顯示的指定format的屬性值,默認(rèn)為"strict_date_optional_time||epoch_millis"

"strict_date_optional_time"為常規(guī)的iso日期時(shí)間轉(zhuǎn)換器,格式“yyyy-MM-dd ‘T’ HH:mm:ss.SSSZ” or “yyyy-MM-dd”,es默認(rèn)內(nèi)置了很多日期格式,大家可以翻閱文檔查看



PUT my-index-000003/_mapping
{

    "properties": {
      "create_time":{
        "type": "date",
        "format":"yyyy-MM-dd HH:mm:ss"
      }
    }

}


POST my-index-000003/_doc
{
  "create_time":"2021-05-15 23:14:55"

}








1.5 alias

為已存在的字段定義別名,別名可用于卻大多數(shù)搜索api和field capabilities 。目前不是和寫入api,比如添加或者更新等操作。



type : “alias”, path為當(dāng)前目標(biāo)字段的路徑,如果該字段是有父類對象,

則path為 parentObject1.parentObject2.target_field



例如:



PUT /my-index-000003

{

  "mappings": {

    "properties": {

      "user_name":{

        "type": "text"

      },

      "name":{

        "type": "alias",

        "path" :"user_name"

      },

      "friends":{

        "type": "nested",

        "properties": {

          "friends_name":{

            "type":"text"

          },

          "f_name":{

            "type": "alias",

            "path":"friends.friends_name"

          }

        }



      }



    }

  }

}





POST /my-index-000003/_doc/1

{

  "user_name":"ly",

  "frends":{

    "friends_name":"luck"

  }

}



GET /my-index-000003/_search?pretty

{

  "query": {

    "match": {

      "name": "ly"

    }

  }

}


2.Objects and relational types(對象關(guān)系類型)
2.1 object

對象類型:字段值是一個(gè)json對象

POST customer/_doc/3
{
  "name":"孫七",
  "state":1,
  "create_time":"2021-03-14 18:00:00",
  "other":{
    "age":27,
    "address":"beijin",
    "phone":"10010"
  }
}


不顯示指定字段類型,直接往里添加文檔也是可以的,es默認(rèn)會幫我們創(chuàng)建合適的類型,其他對象類型還有flattened,nested,join在object的基礎(chǔ)上,提供了自己的一些特性,彌補(bǔ)了object的不足



3.Text search types(文本搜索類型)

text是全文搜索類型,在建立索引和搜索時(shí),輸入的文本會經(jīng)過分析器處理(Analyzed),分析器會對其進(jìn)行過濾,分詞,轉(zhuǎn)換等操作。es內(nèi)置了多種分析器,而且我們可以定義分析器。

只有text類型才能用于match,match_phrase等搜索語句,

PUT /my-index-000003
{
  "mappings": {
    "properties": {
      "user_name":{
        "type": "text"
      }

    }
  }
}


POST /my-index-000003/_doc
{
  "user_name":"jack liu"
}


GET /my-index-000003/_search
{
  "query": {
    "match": {
      "user_name": "jack"
    }
  }
}
4. Arrays 數(shù)組類型

es沒有專門的數(shù)組類型,所有類型字段都可以一個(gè)或者多個(gè)值,只是多個(gè)值得類型必須相同。



PUT my-index-000001/_doc/1

{

  "message": "some arrays in this document...",

  "tags":  [ "elasticsearch", "wow" ],

  "lists": [

    {

      "name": "prog_list",

      "description": "programming list"

    },

    {

      "name": "cool_list",

      "description": "cool stuff list"

    }

  ]

}




作者:碼農(nóng)編程進(jìn)階筆記


歡迎關(guān)注微信公眾號 :碼農(nóng)編程進(jìn)階筆記