Elastic Search 索引 API 介紹

前言

Elastic Search 主要靠 Restful api 來對索引進行操做。主要分爲兩類,一類是索引的管理類的 api ,包括索引的建立、修改、刪除、查詢等,文檔的建立、修改、刪除等。還有一類是查詢類,包括各類條件的文檔的檢索。html

這裏咱們準備了好了一個場景。在這裏咱們假定有一批做者,每一個做者都有標識、姓名、性別、年齡,描述着幾個字段。每一個做者都會寫一些列的文章,文章包括文章標識、標題、做者標識、內容、發表時間字段。咱們須要經過姓名、年齡、描述中的關鍵詞來查詢做者,須要根據發表時間、標題關鍵詞、內容關鍵詞以及做者來查詢文章。node

這裏分析一下。咱們須要建兩個索引,一個是做者索引,還有一個是文章索引。其中做者索引的描述字段和文章索引的標題、內容字段須要作分詞。linux

如下全部操做都是在前文《Elastic Search 安裝和配置》的基礎上進行的。大部分的 rest api 的請求都是在 postman 這個工具裏完成。git

安裝分詞解析器

要按照關鍵詞進行搜素,須要對對應的字段的值進行分詞。針對中文,須要指定特殊的分詞插件。這裏咱們用了 IK 分詞插件。這個插件有針對 Elastic Search 的安裝包。注意必定要安裝對應版本的。前面安裝的 Elastic Search 的版本時 6.1.1 因此用下面的命令來安裝:程序員

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.1.1/elasticsearch-analysis-ik-6.1.1.zip
複製代碼

安裝好了後,重啓 Elastic Search,執行命令github

curl http://10.110.2.53:9200/_cat/plugins
master analysis-ik 6.1.1
複製代碼

能夠看到,IK 6.1.1的分詞器已經安裝好了docker

索引操做

建立索引

一個典型的索引建立的 rest api 接口的調用以下所示:json

curl -X PUT -H 'Content-Type:application/json'  \
http://10.110.2.53:9200/author -d ' { "settings": { "index": { "number_of_shards": 6, "number_of_replicas": 0 } }, "mappings": { "person": { "properties": { "name": { "type": "text" }, "sex": { "type": "text" }, "age": { "type": "integer" }, "des": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" } } } } } '
複製代碼

這裏包含兩個部分,第一個部分是索引設置(Setting),第二個部分是索引映射(Mapping)api

索引設置

索引設置經過 settings.index 用來設置索引的相關配置。例子中設置索引的分片數量(number_of_shards)爲 6 個,副本的數量(number_of_replicas)爲 0 。由於咱們的實驗環境是單節點的,因此不建立副本。不然由於沒法把副本建立到第二個 node 上,會致使索引的健康狀態爲 yellow。bash

索引映射

索引映射( mapping)就是用來在建立索引的時候,指定索引中字段的配置。配置的內容包括

  • 字段是否能夠被全文索引(分詞)
  • 字段存儲的數據類型
  • 字段顯示的數據格式
  • 字段是否要放到 _all 這個內置的字段中。這個特性已經被在6.0版本被聲明爲不推薦使用了
明確索引映射

建立索引的時候,明確經過 mappings 參數來設置每一個字段的映射就叫作明確索引映射。如上述的例子。

動態索引映射

除了在建立索引的時候指定索引字段的映射關係,還有一個簡單的建立索引的方式是不指定索引字段的映射,Elastic Search 將會爲索引採用動態映射(dynamic mapping)方式在第一次索引這個字段的時候自動推進自動的存儲類型、存儲格式等。

例如咱們能夠用一下方法建立一個做者(author)的索引

curl -X PUT http://10.110.2.53:9200/author
複製代碼

這個裏面咱們沒有爲這個索引設置任何映射信息。當咱們用下面的信息爲這個索引建立第一個文檔的時候,會自動的將 name、sex、des 映射爲 text 類型,而將 age 映射爲 long 。

{
	"name":"楊高超",
	"age":24,
	"sex":"男",
	"des":"IT軟件工程師,擅長Java和軟件架構"
 }
複製代碼

除了建立索引,還有修改索引、查詢索引、刪除索引等操做 api。更多、更詳細的索引操做 api 的用法能夠參考官網文檔

文檔查詢

經過下面的命令查詢 author 索引的詳細信息以下:

curl http://10.110.2.53:9200/author?pretty
{
  "author" : {
    "aliases" : { },
    "mappings" : {
      "doc" : {
        "properties" : {
          "age" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "des" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          },
          "name" : {
            "type" : "text"
          },
          "age" : {
            "type" : "integer"
          },
          "sex" : {
            "type" : "text"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1515160270198",
        "number_of_shards" : "6",
        "number_of_replicas" : "0",
        "uuid" : "v1E0_mfAR5qRIroOV31HOA",
        "version" : {
          "created" : "6010199"
        },
        "provided_name" : "author"
      }
    }
  }
}
複製代碼

文檔索引

下面的命令將一個做者文檔索引到做者索引中

curl  -H 'Content-Type:application/json' http://10.110.2.53:9200/author -d ' { "name": "李高超", "age": 23, "sex": "女", "des": "IT軟件經理,擅長Java和開發管理" } '
複製代碼

最後索引到做者 (author) 索引和文章(article)索引的數據列表以下

做者索引文檔數據

文章索引文檔數據

文檔查詢

全文索引

curl -X GET 'http://10.110.2.53:9200/article/_search?q=docker搭建gitlab&pretty'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 6,
    "successful" : 6,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.3862944,
    "hits" : [
      {
        "_index" : "article",
        "_type" : "doc",
        "_id" : "rKOjxmABQGn3FeQBeqAg",
        "_score" : 1.3862944,
        "_source" : {
          "title" : "經過 docker 搭建自用的 gitlab 服務",
          "author" : "qaOXxmABQGn3FeQBMqCA",
          "created" : "2018-01-01 15:11:11",
          "context" : "git 是當下如日中天的版本管理系統。如今若是不是工做在 git 版本管理系統之下,幾乎都很差意思和人打招呼了。有不少現成的互聯網的 git 服務提供給你們使用,例如號稱程序員社交網絡的 GitHub,還有低調好用的 bitbucket 。這些給我的使用或者公司用來作開源使用都沒有什麼問題。但若是在部門內推廣使用就會涉及到代碼不能公開或者額外的費用的問題。本人原來在部門內採用的是手工在 linux 服務器上來管理代碼倉庫。權限無法設置,也很是不方便。因此也一直很苦惱。"
        }
      }
    ]
  }
}
複製代碼

複雜查詢

curl -X POST -H 'Content-Type:application/json' http://10.110.2.53:9200/author/_search?pretty -d ' { "took" : 5, "timed_out" : false, "_shards" : { "total" : 6, "successful" : 6, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 2, "max_score" : 0.2876821, "hits" : [ { "_index" : "author", "_type" : "doc", "_id" : "qaOXxmABQGn3FeQBMqCA", "_score" : 0.2876821, "_source" : { "name" : "楊高超", "age" : "24", "sex" : "男", "des" : "IT軟件工程師,擅長Java和軟件架構" } }, { "_index" : "author", "_type" : "doc", "_id" : "qqOXxmABQGn3FeQBiKCD", "_score" : 0.2876821, "_source" : { "name" : "李高超", "age" : "23", "sex" : "女", "des" : "IT軟件經理,擅長Java和開發管理" } } ] } } 複製代碼

帶布爾計算的查詢

curl -X POST -H 'Content-Type:application/json' http://10.110.2.53:9200/author/_search?pretty -d ' { "query": { "bool": { "must": [ { "match": { "des": "經理" } }, { "match": { "name": "高超" } } ] } } } '
複製代碼

這個查詢獲得 name 包含「高超」, des 包含「經理」的做者

更多、更詳細的查詢用法能夠參考官網文檔。你們能夠基於咱們的樣例和文檔說明執行更多的查詢。

後記

對於 Elastic Search 的 Api 的詳細用法能夠多參考官網的說明。實際上咱們在程序中使用。都是使用高級 Api 來操做。後續咱們在用別的文章來講明。

相關文章
相關標籤/搜索