目錄
1、安裝
2、基本概念
2.1 Node 與 Cluster
2.2 Index
2.3 Document?
2.4 Type
3、新建和刪除 Index
4、中文分詞設(shè)置?
5、數(shù)據(jù)操作?
5.1 新增記錄?
5.2 查看記錄?
?5.3 刪除記錄
5.4 更新記錄?
6、數(shù)據(jù)查詢
6.1 返回所有記錄
6.2 全文搜索
?6.3 邏輯運(yùn)算
7、參考鏈接
本文從零開始,講解如何使用 Elastic 搭建自己的全文搜索引擎。
1、安裝
需要 Java 8 環(huán)境,自行安裝配置java環(huán)境變量。
安裝完 Java,就可以跟著官方文檔安裝 Elastic。直接下載壓縮包比較簡(jiǎn)單。
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
$ unzip elasticsearch-5.5.1.zip
$ cd elasticsearch-5.5.1/
接著,進(jìn)入解壓后的目錄,運(yùn)行下面的命令,啟動(dòng) Elastic。
$ ./bin/elasticsearch
如果這時(shí)報(bào)錯(cuò)"max virtual memory areas vm.maxmapcount [65530] is too low",要運(yùn)行下面的命令。
$ sudo sysctl -w vm.max_map_count=262144
如果一切正常,Elastic 就會(huì)在默認(rèn)的9200端口運(yùn)行。這時(shí),打開另一個(gè)命令行窗口,請(qǐng)求該端口,會(huì)得到說(shuō)明信息。
$ curl localhost:9200
{
"name" : "atntrTf",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
上面代碼中,請(qǐng)求9200端口,Elastic 返回一個(gè) JSON 對(duì)象,包含當(dāng)前節(jié)點(diǎn)、集群、版本等信息。
按下 Ctrl + C,Elastic 就會(huì)停止運(yùn)行。
默認(rèn)情況下,Elastic 只允許本機(jī)訪問(wèn),如果需要遠(yuǎn)程訪問(wèn),可以修改 Elastic 安裝目錄的config/elasticsearch.yml
文件,去掉network.host
的注釋,將它的值改成0.0.0.0
,然后重新啟動(dòng) Elastic。
network.host: 0.0.0.0
上面代碼中,設(shè)成0.0.0.0
讓任何人都可以訪問(wèn)。線上服務(wù)不要這樣設(shè)置,要設(shè)成具體的 IP。
2、基本概念
2.1 Node 與 Cluster
Elastic 本質(zhì)上是一個(gè)分布式數(shù)據(jù)庫(kù),允許多臺(tái)服務(wù)器協(xié)同工作,每臺(tái)服務(wù)器可以運(yùn)行多個(gè) Elastic 實(shí)例。
單個(gè) Elastic 實(shí)例稱為一個(gè)節(jié)點(diǎn)(node)。一組節(jié)點(diǎn)構(gòu)成一個(gè)集群(cluster)。
2.2 Index
Elastic 會(huì)索引所有字段,經(jīng)過(guò)處理后寫入一個(gè)反向索引(Inverted Index)。查找數(shù)據(jù)的時(shí)候,直接查找該索引。
所以,Elastic 數(shù)據(jù)管理的頂層單位就叫做 Index(索引)。它是單個(gè)數(shù)據(jù)庫(kù)的同義詞。每個(gè) Index (即數(shù)據(jù)庫(kù))的名字必須是小寫。
下面的命令可以查看當(dāng)前節(jié)點(diǎn)的所有 Index。
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
2.3 Document?
Index 里面單條的記錄稱為 Document(文檔)。許多條 Document 構(gòu)成了一個(gè) Index。
Document 使用 JSON 格式表示,下面是一個(gè)例子。
{
"user": "張三",
"title": "工程師",
"desc": "數(shù)據(jù)庫(kù)管理"
}
同一個(gè) Index 里面的 Document,不要求有相同的結(jié)構(gòu)(scheme),但是最好保持相同,這樣有利于提高搜索效率。
2.4 Type
Document 可以分組,比如weather
這個(gè) Index 里面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來(lái)過(guò)濾 Document。
不同的 Type 應(yīng)該有相似的結(jié)構(gòu)(schema),舉例來(lái)說(shuō),id
字段不能在這個(gè)組是字符串,在另一個(gè)組是數(shù)值。這是與關(guān)系型數(shù)據(jù)庫(kù)的表的一個(gè)區(qū)別。性質(zhì)完全不同的數(shù)據(jù)(比如products
和logs
)應(yīng)該存成兩個(gè) Index,而不是一個(gè) Index 里面的兩個(gè) Type(雖然可以做到)。
下面的命令可以列出每個(gè) Index 所包含的 Type。
$ curl 'localhost:9200/_mapping?pretty=true'
根據(jù)規(guī)劃,Elastic 6.x 版只允許每個(gè) Index 包含一個(gè) Type,7.x 版將會(huì)徹底移除 Type。
3、新建和刪除 Index
新建 Index,可以直接向 Elastic 服務(wù)器發(fā)出 PUT 請(qǐng)求。下面的例子是新建一個(gè)名叫weather
的 Index。
$ curl -X PUT 'localhost:9200/weather'
服務(wù)器返回一個(gè) JSON 對(duì)象,里面的acknowledged
字段表示操作成功。?
{
"acknowledged":true,
"shards_acknowledged":true
}
然后,我們發(fā)出 DELETE 請(qǐng)求,刪除這個(gè) Index。
$ curl -X DELETE 'localhost:9200/weather'
4、中文分詞設(shè)置?
首先,安裝中文分詞插件。這里使用的是?ik,也可以考慮其他插件(比如?smartcn)。
$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip
上面代碼安裝的是5.5.1版的插件,與 Elastic 5.5.1 配合使用。
接著,重新啟動(dòng) Elastic,就會(huì)自動(dòng)加載這個(gè)新安裝的插件。
然后,新建一個(gè) Index,指定需要分詞的字段。這一步根據(jù)數(shù)據(jù)結(jié)構(gòu)而異,下面的命令只針對(duì)本文?;旧?,凡是需要搜索的中文字段,都要單獨(dú)設(shè)置一下。
$ curl -X PUT 'localhost:9200/accounts' -d '
{
"mappings": {
"person": {
"properties": {
"user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"desc": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}'
上面代碼中,首先新建一個(gè)名稱為accounts
的 Index,里面有一個(gè)名稱為person
的 Type。person
有三個(gè)字段。?
- user
- title
- desc
這三個(gè)字段都是中文,而且類型都是文本(text),所以需要指定中文分詞器,不能使用默認(rèn)的英文分詞器。
Elastic 的分詞器稱為?analyzer。我們對(duì)每個(gè)字段指定分詞器。
"user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
上面代碼中,analyzer
是字段文本的分詞器,search_analyzer
是搜索詞的分詞器。ik_max_word
分詞器是插件ik
提供的,可以對(duì)文本進(jìn)行最大數(shù)量的分詞。?
5、數(shù)據(jù)操作?
5.1 新增記錄?
向指定的 /Index/Type 發(fā)送 PUT 請(qǐng)求,就可以在 Index 里面新增一條記錄。比如,向/accounts/person
發(fā)送請(qǐng)求,就可以新增一條人員記錄。
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "張三",
"title": "工程師",
"desc": "數(shù)據(jù)庫(kù)管理"
}'
?服務(wù)器返回的 JSON 對(duì)象,會(huì)給出 Index、Type、Id、Version 等信息。
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":1,
"result":"created",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true
}
如果你仔細(xì)看,會(huì)發(fā)現(xiàn)請(qǐng)求路徑是/accounts/person/1
,最后的1
是該條記錄的 Id。它不一定是數(shù)字,任意字符串(比如abc
)都可以。
新增記錄的時(shí)候,也可以不指定 Id,這時(shí)要改成 POST 請(qǐng)求。
$ curl -X POST 'localhost:9200/accounts/person' -d '
{
"user": "李四",
"title": "工程師",
"desc": "系統(tǒng)管理"
}'
上面代碼中,向/accounts/person
發(fā)出一個(gè) POST 請(qǐng)求,添加一個(gè)記錄。這時(shí),服務(wù)器返回的 JSON 對(duì)象里面,_id
字段就是一個(gè)隨機(jī)字符串。
{
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_version":1,
"result":"created",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true
}
注意,如果沒(méi)有先創(chuàng)建 Index(這個(gè)例子是accounts
),直接執(zhí)行上面的命令,Elastic 也不會(huì)報(bào)錯(cuò),而是直接生成指定的 Index。所以,打字的時(shí)候要小心,不要寫錯(cuò) Index 的名稱。?
5.2 查看記錄?
向/Index/Type/Id
發(fā)出 GET 請(qǐng)求,就可以查看這條記錄。
$ curl 'localhost:9200/accounts/person/1?pretty=true'
上面代碼請(qǐng)求查看/accounts/person/1
這條記錄,URL 的參數(shù)pretty=true
表示以易讀的格式返回。
返回的數(shù)據(jù)中,found
字段表示查詢成功,_source
字段返回原始記錄。
{
"_index" : "accounts",
"_type" : "person",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"user" : "張三",
"title" : "工程師",
"desc" : "數(shù)據(jù)庫(kù)管理"
}
}
如果 Id 不正確,就查不到數(shù)據(jù),found
字段就是false
。
$ curl 'localhost:9200/weather/beijing/abc?pretty=true'
{
"_index" : "accounts",
"_type" : "person",
"_id" : "abc",
"found" : false
}
?5.3 刪除記錄
刪除記錄就是發(fā)出 DELETE 請(qǐng)求。這里先不要?jiǎng)h除這條記錄,后面還要用到。
$ curl -X DELETE 'localhost:9200/accounts/person/1'
5.4 更新記錄?
更新記錄就是使用 PUT 請(qǐng)求,重新發(fā)送一次數(shù)據(jù)。
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user" : "張三",
"title" : "工程師",
"desc" : "數(shù)據(jù)庫(kù)管理,軟件開發(fā)"
}'
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{"total":2,"successful":1,"failed":0},
"created":false
}
上面代碼中,我們將原始數(shù)據(jù)從"數(shù)據(jù)庫(kù)管理"改成"數(shù)據(jù)庫(kù)管理,軟件開發(fā)"。 返回結(jié)果里面,有幾個(gè)字段發(fā)生了變化。
"_version" : 2,
"result" : "updated",
"created" : false
可以看到,記錄的 Id 沒(méi)變,但是版本(version)從1
變成2
,操作類型(result)從created
變成updated
,created
字段變成false
,因?yàn)檫@次不是新建記錄。?
6、數(shù)據(jù)查詢
6.1 返回所有記錄
使用 GET 方法,直接請(qǐng)求/Index/Type/_search
,就會(huì)返回所有記錄。
$ curl 'localhost:9200/accounts/person/_search'
{
"took":2,
"timed_out":false,
"_shards":{"total":5,"successful":5,"failed":0},
"hits":{
"total":2,
"max_score":1.0,
"hits":[
{
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_score":1.0,
"_source": {
"user": "李四",
"title": "工程師",
"desc": "系統(tǒng)管理"
}
},
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_score":1.0,
"_source": {
"user" : "張三",
"title" : "工程師",
"desc" : "數(shù)據(jù)庫(kù)管理,軟件開發(fā)"
}
}
]
}
}
上面代碼中,返回結(jié)果的?took
字段表示該操作的耗時(shí)(單位為毫秒),timed_out
字段表示是否超時(shí),hits
字段表示命中的記錄,里面子字段的含義如下。
-
total
:返回記錄數(shù),本例是2條。 -
max_score
:最高的匹配程度,本例是1.0
。 -
hits
:返回的記錄組成的數(shù)組。
?返回的記錄中,每條記錄都有一個(gè)_score
字段,表示匹配的程序,默認(rèn)是按照這個(gè)字段降序排列。
6.2 全文搜索
Elastic 的查詢非常特別,使用自己的查詢語(yǔ)法,要求 GET 請(qǐng)求帶有數(shù)據(jù)體。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "軟件" }}
}'
上面代碼使用?Match 查詢,指定的匹配條件是desc
字段里面包含"軟件"這個(gè)詞。返回結(jié)果如下。?
{
"took":3,
"timed_out":false,
"_shards":{"total":5,"successful":5,"failed":0},
"hits":{
"total":1,
"max_score":0.28582606,
"hits":[
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_score":0.28582606,
"_source": {
"user" : "張三",
"title" : "工程師",
"desc" : "數(shù)據(jù)庫(kù)管理,軟件開發(fā)"
}
}
]
}
}
Elastic 默認(rèn)一次返回10條結(jié)果,可以通過(guò)size
字段改變這個(gè)設(shè)置。?
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "管理" }},
"size": 1
}'
上面代碼指定,每次只返回一條結(jié)果。
還可以通過(guò)from
字段,指定位移。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "管理" }},
"from": 1,
"size": 1
}'
上面代碼指定,從位置1開始(默認(rèn)是從位置0開始),只返回一條結(jié)果。?
?6.3 邏輯運(yùn)算
如果有多個(gè)搜索關(guān)鍵字, Elastic 認(rèn)為它們是or
關(guān)系。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "軟件 系統(tǒng)" }}
}'
上面代碼搜索的是軟件 or 系統(tǒng)
。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-492233.html
如果要執(zhí)行多個(gè)關(guān)鍵詞的and
搜索,必須使用布爾查詢。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-492233.html
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "desc": "軟件" } },
{ "match": { "desc": "系統(tǒng)" } }
]
}
}
}'
7、參考鏈接?
- ElasticSearch 官方手冊(cè)
- A Practical Introduction to Elasticsearch
- 全文搜索引擎 Elasticsearch 入門教程 - 阮一峰的網(wǎng)絡(luò)日志
到了這里,關(guān)于全文搜索引擎 Elasticsearch 入門使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!