前言
Elastic Search 主要靠 Restful api 來對索引進(jìn)行操作媳友。主要分為兩類风科,一類是索引的管理類的 api ,包括索引的創(chuàng)建乞旦、修改贼穆、刪除、查詢等兰粉,文檔的創(chuàng)建故痊、修改、刪除等玖姑。還有一類是查詢類愕秫,包括各種條件的文檔的檢索慨菱。
這里我們準(zhǔn)備了好了一個場景。在這里我們假定有一批作者戴甩,每個作者都有標(biāo)識符喝、姓名、性別甜孤、年齡协饲,描述著幾個字段。每個作者都會寫一些列的文章缴川,文章包括文章標(biāo)識茉稠、標(biāo)題、作者標(biāo)識把夸、內(nèi)容而线、發(fā)表時間字段。我們需要通過姓名恋日、年齡膀篮、描述中的關(guān)鍵詞來查詢作者,需要根據(jù)發(fā)表時間谚鄙、標(biāo)題關(guān)鍵詞各拷、內(nèi)容關(guān)鍵詞以及作者來查詢文章。
這里分析一下闷营。我們需要建兩個索引烤黍,一個是作者索引,還有一個是文章索引傻盟。其中作者索引的描述字段和文章索引的標(biāo)題速蕊、內(nèi)容字段需要做分詞。
以下所有操作都是在前文《Elastic Search 安裝和配置》的基礎(chǔ)上進(jìn)行的娘赴。大部分的 rest api 的請求都是在 postman 這個工具里完成规哲。
安裝分詞解析器
要按照關(guān)鍵詞進(jìn)行搜素,需要對對應(yīng)的字段的值進(jìn)行分詞诽表。針對中文唉锌,需要指定特殊的分詞插件。這里我們用了 IK 分詞插件竿奏。這個插件有針對 Elastic Search 的安裝包袄简。注意一定要安裝對應(yīng)版本的。前面安裝的 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绿语,執(zhí)行命令
curl http://10.110.2.53:9200/_cat/plugins
master analysis-ik 6.1.1
可以看到,IK 6.1.1的分詞器已經(jīng)安裝好了
索引操作
創(chuàng)建索引
一個典型的索引創(chuàng)建的 rest api 接口的調(diào)用如下所示:
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"
}
}
}
}
}
'
這里包含兩個部分,第一個部分是索引設(shè)置(Setting)吕粹,第二個部分是索引映射(Mapping)
索引設(shè)置
索引設(shè)置通過 settings.index 用來設(shè)置索引的相關(guān)配置种柑。例子中設(shè)置索引的分片數(shù)量(number_of_shards)為 6 個,副本的數(shù)量(number_of_replicas)為 0 匹耕。因為我們的實(shí)驗環(huán)境是單節(jié)點(diǎn)的聚请,所以不創(chuàng)建副本。否則因為無法把副本創(chuàng)建到第二個 node 上泌神,會導(dǎo)致索引的健康狀態(tài)為 yellow良漱。
索引映射
索引映射( mapping)就是用來在創(chuàng)建索引的時候,指定索引中字段的配置欢际。配置的內(nèi)容包括
- 字段是否可以被全文索引(分詞)
- 字段存儲的數(shù)據(jù)類型
- 字段顯示的數(shù)據(jù)格式
- 字段是否要放到 _all 這個內(nèi)置的字段中母市。這個特性已經(jīng)被在6.0版本被聲明為不推薦使用了
明確索引映射
創(chuàng)建索引的時候,明確通過 mappings 參數(shù)來設(shè)置每個字段的映射就叫做明確索引映射损趋。如上述的例子患久。
動態(tài)索引映射
除了在創(chuàng)建索引的時候指定索引字段的映射關(guān)系,還有一個簡單的創(chuàng)建索引的方式是不指定索引字段的映射浑槽,Elastic Search 將會為索引采用動態(tài)映射(dynamic mapping)方式在第一次索引這個字段的時候自動推動自動的存儲類型蒋失、存儲格式等。
例如我們可以用一下方法創(chuàng)建一個作者(author)的索引
curl -X PUT http://10.110.2.53:9200/author
這個里面我們沒有為這個索引設(shè)置任何映射信息桐玻。當(dāng)我們用下面的信息為這個索引創(chuàng)建第一個文檔的時候篙挽,會自動的將 name、sex镊靴、des 映射為 text 類型铣卡,而將 age 映射為 long 。
{
"name":"楊高超",
"age":24,
"sex":"男",
"des":"IT軟件工程師偏竟,擅長Java和軟件架構(gòu)"
}
除了創(chuàng)建索引煮落,還有修改索引、查詢索引踊谋、刪除索引等操作 api蝉仇。更多、更詳細(xì)的索引操作 api 的用法可以參考官網(wǎng)文檔
文檔查詢
通過下面的命令查詢 author 索引的詳細(xì)信息如下:
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軟件經(jīng)理殖蚕,擅長Java和開發(fā)管理"
}
'
最后索引到作者 (author) 索引和文章(article)索引的數(shù)據(jù)列表如下
文檔查詢
全文索引
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 服務(wù)",
"author" : "qaOXxmABQGn3FeQBMqCA",
"created" : "2018-01-01 15:11:11",
"context" : "git 是當(dāng)下如日中天的版本管理系統(tǒng)〗蜗危現(xiàn)在如果不是工作在 git 版本管理系統(tǒng)之下,幾乎都不好意思和人打招呼了睦疫。有很多現(xiàn)成的互聯(lián)網(wǎng)的 git 服務(wù)提供給大家使用呀枢,例如號稱程序員社交網(wǎng)絡(luò)的 GitHub,還有低調(diào)好用的 bitbucket 笼痛。這些給個人使用或者公司用來做開源使用都沒有什么問題。但如果在部門內(nèi)推廣使用就會涉及到代碼不能公開或者額外的費(fèi)用的問題。本人原來在部門內(nèi)采用的是手工在 linux 服務(wù)器上來管理代碼倉庫缨伊。權(quán)限沒法設(shè)置摘刑,也非常不方便。所以也一直很苦惱刻坊。"
}
}
]
}
}
復(fù)雜查詢
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和軟件架構(gòu)"
}
},
{
"_index" : "author",
"_type" : "doc",
"_id" : "qqOXxmABQGn3FeQBiKCD",
"_score" : 0.2876821,
"_source" : {
"name" : "李高超",
"age" : "23",
"sex" : "女",
"des" : "IT軟件經(jīng)理,擅長Java和開發(fā)管理"
}
}
]
}
}
帶布爾計算的查詢
curl -X POST -H 'Content-Type:application/json' http://10.110.2.53:9200/author/_search?pretty -d '
{
"query": {
"bool": {
"must": [
{
"match": {
"des": "經(jīng)理"
}
},
{
"match": {
"name": "高超"
}
}
]
}
}
}
'
這個查詢得到 name 包含“高超”谭胚, des 包含“經(jīng)理”的作者
更多徐块、更詳細(xì)的查詢用法可以參考官網(wǎng)文檔。大家可以基于我們的樣例和文檔說明執(zhí)行更多的查詢灾而。
后記
對于 Elastic Search 的 Api 的詳細(xì)用法可以多參考官網(wǎng)的說明胡控。實(shí)際上我們在程序中使用。都是使用高級 Api 來操作旁趟。后續(xù)我們在用別的文章來說明昼激。