前言
Elastic Search 主要靠 Restful api 來對索引進行操作。主要分為兩類,一類是索引的管理類的 api ,包括索引的建立、修改、刪除、查詢等,文件的建立、修改、刪除等。還有一類是查詢類,包括各種條件的文件的檢索。
這裡我們準備了好了一個場景。在這裡我們假定有一批作者,每個作者都有標識、姓名、性別、年齡,描述著幾個欄位。每個作者都會寫一些列的文章,文章包括文章標識、標題、作者標識、內容、發表時間欄位。我們需要通過姓名、年齡、描述中的關鍵詞來查詢作者,需要根據發表時間、標題關鍵詞、內容關鍵詞以及作者來查詢文章。
這裡分析一下。我們需要建兩個索引,一個是作者索引,還有一個是文章索引。其中作者索引的描述欄位和文章索引的標題、內容欄位需要做分詞。
以下所有操作都是在前文《Elastic Search 安裝和配置》的基礎上進行的。大部分的 rest api 的請求都是在 postman 這個工具裡完成。
安裝分詞解析器
要按照關鍵詞進行搜素,需要對對應的欄位的值進行分詞。針對中文,需要指定特殊的分詞外掛。這裡我們用了 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,執行命令
curl http://10.110.2.53:9200/_cat/plugins
master analysis-ik 6.1.1
複製程式碼
可以看到,IK 6.1.1的分詞器已經安裝好了
索引操作
建立索引
一個典型的索引建立的 rest api 介面的呼叫如下所示:
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)
索引設定
索引設定通過 settings.index 用來設定索引的相關配置。例子中設定索引的分片數量(number_of_shards)為 6 個,副本的數量(number_of_replicas)為 0 。因為我們的實驗環境是單節點的,所以不建立副本。否則因為無法把副本建立到第二個 node 上,會導致索引的健康狀態為 yellow。
索引對映
索引對映( 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 來操作。後續我們在用別的文章來說明。