自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全文搜索引擎ElasticSearch入門教程

開發(fā) 前端
本文從零開始,講解如何使用 Elastic 搭建自己的全文搜索引擎。每一步都有詳細的說明,大家跟著做就能學會。

全文搜索 屬于最常見的需求,開源的 ElasticSearch (以下簡稱 Elastic)是目前全文搜索引擎的首選。

它可以快速地儲存、搜索和分析海量數(shù)據(jù)。維基百科、Stack Overflow、Github 都采用它。

全文搜索引擎ElasticSearch入門教程

Elastic 的底層是開源庫 Lucene 。但是,你沒法直接用 Lucene,必須自己寫代碼去調用它的接口。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。

本文從零開始,講解如何使用 Elastic 搭建自己的全文搜索引擎。每一步都有詳細的說明,大家跟著做就能學會。

一、安裝

Elastic 需要 Java 8 環(huán)境。如果你的機器還沒安裝 Java,可以參考 這篇文章 ,注意要保證環(huán)境變量 JAVA_HOME 正確設置。

安裝完 Java,就可以跟著 官方文檔 安裝 Elastic。直接下載壓縮包比較簡單。

 

  1. $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip  
  2. $ unzip elasticsearch-5.5.1.zip  
  3. $ cd elasticsearch-5.5.1/ 

接著,進入解壓后的目錄,運行下面的命令,啟動 Elastic。

  1. $ ./bin/elasticsearch 

如果這時 報錯 "max virtual memory areas vm.max map count [65530] is too low",要運行下面的命令。

  1. $ sudo sysctl -w vm.max_map_count=262144 

如果一切正常,Elastic 就會在默認的9200端口運行。這時,打開另一個命令行窗口,請求該端口,會得到說明信息。

  1. $ curl localhost:9200  
  2.   "name" : "atntrTf"
  3.   "cluster_name" : "elasticsearch"
  4.   "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA"
  5.   "version" : { 
  6.     "number" : "5.5.1"
  7.     "build_hash" : "19c13d0"
  8.     "build_date" : "2017-07-18T20:44:24.823Z"
  9.     "build_snapshot" : false
  10.     "lucene_version" : "6.6.0" 
  11.   }, 
  12.   "tagline" : "You Know, for Search" 

上面代碼中,請求9200端口,Elastic 返回一個 JSON 對象,包含當前節(jié)點、集群、版本等信息。

按下 Ctrl + C,Elastic 就會停止運行。

默認情況下,Elastic 只允許本機訪問,如果需要遠程訪問,可以修改 Elastic 安裝目錄的 config/elasticsearch.yml 文件,去掉 network.host 的注釋,將它的值改成 0.0.0.0 ,然后重新啟動 Elastic。

  1. network.host: 0.0.0.0 

上面代碼中,設成 0.0.0.0 讓任何人都可以訪問。線上服務不要這樣設置,要設成具體的 IP。

二、基本概念

2.1 Node 與 Cluster

Elastic 本質上是一個分布式數(shù)據(jù)庫,允許多臺服務器協(xié)同工作,每臺服務器可以運行多個 Elastic 實例。

單個 Elastic 實例稱為一個節(jié)點(node)。一組節(jié)點構成一個集群(cluster)。

2.2 Index

Elastic 會索引所有字段,經(jīng)過處理后寫入一個反向索引(Inverted Index)。查找數(shù)據(jù)的時候,直接查找該索引。

所以,Elastic 數(shù)據(jù)管理的頂層單位就叫做 Index(索引)。它是單個數(shù)據(jù)庫的同義詞。每個 Index (即數(shù)據(jù)庫)的名字必須是小寫。

下面的命令可以查看當前節(jié)點的所有 Index。

  1. $ curl -X GET 'http://localhost:9200/_cat/indices?v' 

2.3 Document

Index 里面單條的記錄稱為 Document(文檔)。許多條 Document 構成了一個 Index。

Document 使用 JSON 格式表示,下面是一個例子。

 

  1.   "user""張三"
  2.   "title""工程師"
  3.   "desc""數(shù)據(jù)庫管理" 

同一個 Index 里面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利于提高搜索效率。

2.4 Type

Document 可以分組,比如 weather 這個 Index 里面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。

不同的 Type 應該有相似的結構(schema),舉例來說, id 字段不能在這個組是字符串,在另一個組是數(shù)值。這是與關系型數(shù)據(jù)庫的表的 一個區(qū)別 。性質完全不同的數(shù)據(jù)(比如 products 和 logs )應該存成兩個 Index,而不是一個 Index 里面的兩個 Type(雖然可以做到)。

下面的命令可以列出每個 Index 所包含的 Type。

  1. $ curl 'localhost:9200/_mapping?pretty=true' 

根據(jù) 規(guī)劃 ,Elastic 6.x 版只允許每個 Index 包含一個 Type,7.x 版將會徹底移除 Type。

三、新建和刪除 Index

新建 Index,可以直接向 Elastic 服務器發(fā)出 PUT 請求。下面的例子是新建一個名叫 weather 的 Index。

  1. $ curl -X PUT 'localhost:9200/weather' 

服務器返回一個 JSON 對象,里面的 acknowledged 字段表示操作成功。

 

  1.   "acknowledged":true
  2.   "shards_acknowledged":true 

然后,我們發(fā)出 DELETE 請求,刪除這個 Index。

  1. $ curl -X DELETE 'localhost:9200/weather' 

四、中文分詞設置

首先,安裝中文分詞插件。這里使用的是 ik ,也可以考慮其他插件(比如 smartcn )。

  1. $ ./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 配合使用。

接著,重新啟動 Elastic,就會自動加載這個新安裝的插件。

然后,新建一個 Index,指定需要分詞的字段。這一步根據(jù)數(shù)據(jù)結構而異,下面的命令只針對本文?;旧希彩切枰阉鞯闹形淖侄?,都要單獨設置一下。

 

  1. $ curl -X PUT 'localhost:9200/accounts' -d ' 
  2.   "mappings": { 
  3.     "person": { 
  4.       "properties": { 
  5.         "user": { 
  6.           "type""text"
  7.           "analyzer""ik_max_word"
  8.           "search_analyzer""ik_max_word" 
  9.         }, 
  10.         "title": { 
  11.           "type""text"
  12.           "analyzer""ik_max_word"
  13.           "search_analyzer""ik_max_word" 
  14.         }, 
  15.         "desc": { 
  16.           "type""text"
  17.           "analyzer""ik_max_word"
  18.           "search_analyzer""ik_max_word" 
  19.         } 
  20.       } 
  21.     } 
  22.   } 
  23. }' 

上面代碼中,首先新建一個名稱為 accounts 的 Index,里面有一個名稱為 person 的 Type。 person 有三個字段。

  • user
  • title
  • desc

這三個字段都是中文,而且類型都是文本(text),所以需要指定中文分詞器,不能使用默認的英文分詞器。

Elastic 的分詞器稱為 analyzer 。我們對每個字段指定分詞器。

 

  1. "user": { 
  2.   "type""text"
  3.   "analyzer""ik_max_word"
  4.   "search_analyzer""ik_max_word" 

上面代碼中, analyzer 是字段文本的分詞器, search_analyzer 是搜索詞的分詞器。 ik_max_word 分詞器是插件 ik 提供的,可以對文本進行最大數(shù)量的分詞。

五、數(shù)據(jù)操作

5.1 新增記錄

向指定的 /Index/Type 發(fā)送 PUT 請求,就可以在 Index 里面新增一條記錄。比如,向 /accounts/person 發(fā)送請求,就可以新增一條人員記錄。

 

  1. $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' 
  2.   "user""張三"
  3.   "title""工程師"
  4.   "desc""數(shù)據(jù)庫管理" 
  5. }' 

服務器返回的 JSON 對象,會給出 Index、Type、Id、Version 等信息。

 

  1.   "_index":"accounts"
  2.   "_type":"person"
  3.   "_id":"1"
  4.   "_version":1, 
  5.   "result":"created"
  6.   "_shards":{"total":2,"successful":1,"failed":0}, 
  7.   "created":true 

如果你仔細看,會發(fā)現(xiàn)請求路徑是 /accounts/person/1 ,最后的 1 是該條記錄的 Id。它不一定是數(shù)字,任意字符串(比如 abc )都可以。

新增記錄的時候,也可以不指定 Id,這時要改成 POST 請求。

 

  1. $ curl -X POST 'localhost:9200/accounts/person' -d ' 
  2.   "user""李四"
  3.   "title""工程師"
  4.   "desc""系統(tǒng)管理" 
  5. }' 

上面代碼中,向 /accounts/person 發(fā)出一個 POST 請求,添加一個記錄。這時,服務器返回的 JSON 對象里面, _id 字段就是一個隨機字符串。

 

  1.   "_index":"accounts"
  2.   "_type":"person"
  3.   "_id":"AV3qGfrC6jMbsbXb6k1p"
  4.   "_version":1, 
  5.   "result":"created"
  6.   "_shards":{"total":2,"successful":1,"failed":0}, 
  7.   "created":true 

注意,如果沒有先創(chuàng)建 Index(這個例子是 accounts ),直接執(zhí)行上面的命令,Elastic 也不會報錯,而是直接生成指定的 Index。所以,打字的時候要小心,不要寫錯 Index 的名稱。

5.2 查看記錄

向 /Index/Type/Id 發(fā)出 GET 請求,就可以查看這條記錄。

  1. $ curl 'localhost:9200/accounts/person/1?pretty=true' 

上面代碼請求查看 /accounts/person/1 這條記錄,URL 的參數(shù) pretty=true 表示以易讀的格式返回。

返回的數(shù)據(jù)中, found 字段表示查詢成功, _source 字段返回原始記錄。

 

  1.   "_index" : "accounts"
  2.   "_type" : "person"
  3.   "_id" : "1"
  4.   "_version" : 1, 
  5.   "found" : true
  6.   "_source" : { 
  7.     "user" : "張三"
  8.     "title" : "工程師"
  9.     "desc" : "數(shù)據(jù)庫管理" 
  10.   } 

如果 Id 不正確,就查不到數(shù)據(jù), found 字段就是 false 。

 

  1. $ curl 'localhost:9200/weather/beijing/abc?pretty=true'  
  2.   "_index" : "weather"
  3.   "_type" : "beijing"
  4.   "_id" : "abc"
  5.   "found" : false 

5.3 刪除記錄

刪除記錄就是發(fā)出 DELETE 請求。

  1. $ curl -X DELETE 'localhost:9200/accounts/person/1' 

這里先不要刪除這條記錄,后面還要用到。

5.4 更新記錄

更新記錄就是使用 PUT 請求,重新發(fā)送一次數(shù)據(jù)。

 

  1. $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' 
  2.     "user" : "張三"
  3.     "title" : "工程師"
  4.     "desc" : "數(shù)據(jù)庫管理,軟件開發(fā)" 
  5. }'  
  6.  
  7.   "_index":"accounts"
  8.   "_type":"person"
  9.   "_id":"1"
  10.   "_version":2, 
  11.   "result":"updated"
  12.   "_shards":{"total":2,"successful":1,"failed":0}, 
  13.   "created":false 

上面代碼中,我們將原始數(shù)據(jù)從"數(shù)據(jù)庫管理"改成"數(shù)據(jù)庫管理,軟件開發(fā)"。 返回結果里面,有幾個字段發(fā)生了變化。

 

  1. "_version" : 2, 
  2. "result" : "updated"
  3. "created" : false 

可以看到,記錄的 Id 沒變,但是版本(version)從 1 變成 2 ,操作類型(result)從 created 變成 updated , created 字段變成 false ,因為這次不是新建記錄。

六、數(shù)據(jù)查詢

6.1 返回所有記錄

使用 GET 方法,直接請求 /Index/Type/_search ,就會返回所有記錄。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  
  2.   "took":2, 
  3.   "timed_out":false
  4.   "_shards":{"total":5,"successful":5,"failed":0}, 
  5.   "hits":{ 
  6.     "total":2, 
  7.     "max_score":1.0, 
  8.     "hits":[ 
  9.       { 
  10.         "_index":"accounts"
  11.         "_type":"person"
  12.         "_id":"AV3qGfrC6jMbsbXb6k1p"
  13.         "_score":1.0, 
  14.         "_source": { 
  15.           "user""李四"
  16.           "title""工程師"
  17.           "desc""系統(tǒng)管理" 
  18.         } 
  19.       }, 
  20.       { 
  21.         "_index":"accounts"
  22.         "_type":"person"
  23.         "_id":"1"
  24.         "_score":1.0, 
  25.         "_source": { 
  26.           "user" : "張三"
  27.           "title" : "工程師"
  28.           "desc" : "數(shù)據(jù)庫管理,軟件開發(fā)" 
  29.         } 
  30.       } 
  31.     ] 
  32.   } 

上面代碼中,返回結果的 took 字段表示該操作的耗時(單位為毫秒), timed_out 字段表示是否超時, hits 字段表示命中的記錄,里面子字段的含義如下。

  • total :返回記錄數(shù),本例是2條。
  • max_score :最高的匹配程度,本例是 1.0 。
  • hits :返回的記錄組成的數(shù)組。

返回的記錄中,每條記錄都有一個 _score 字段,表示匹配的程序,默認是按照這個字段降序排列。

6.2 全文搜索

Elastic 的查詢非常特別,使用自己的 查詢語法 ,要求 GET 請求帶有數(shù)據(jù)體。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  -d ' 
  2.   "query" : { "match" : { "desc" : "軟件" }} 
  3. }' 

上面代碼使用 Match 查詢 ,指定的匹配條件是 desc 字段里面包含"軟件"這個詞。返回結果如下。

 

  1.   "took":3, 
  2.   "timed_out":false
  3.   "_shards":{"total":5,"successful":5,"failed":0}, 
  4.   "hits":{ 
  5.     "total":1, 
  6.     "max_score":0.28582606, 
  7.     "hits":[ 
  8.       { 
  9.         "_index":"accounts"
  10.         "_type":"person"
  11.         "_id":"1"
  12.         "_score":0.28582606, 
  13.         "_source": { 
  14.           "user" : "張三"
  15.           "title" : "工程師"
  16.           "desc" : "數(shù)據(jù)庫管理,軟件開發(fā)" 
  17.         } 
  18.       } 
  19.     ] 
  20.   } 

Elastic 默認一次返回10條結果,可以通過 size 字段改變這個設置。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  -d ' 
  2.   "query" : { "match" : { "desc" : "管理" }}, 
  3.   "size": 1 
  4. }' 

上面代碼指定,每次只返回一條結果。

還可以通過 from 字段,指定位移。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  -d ' 
  2.   "query" : { "match" : { "desc" : "管理" }}, 
  3.   "from": 1, 
  4.   "size": 1 
  5. }' 

上面代碼指定,從位置1開始(默認是從位置0開始),只返回一條結果。

6.3 邏輯運算

如果有多個搜索關鍵字, Elastic 認為它們是 or 關系。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  -d ' 
  2.   "query" : { "match" : { "desc" : "軟件 系統(tǒng)" }} 
  3. }' 

上面代碼搜索的是 軟件 or 系統(tǒng) 。

如果要執(zhí)行多個關鍵詞的 and 搜索,必須使用 布爾查詢 。

 

  1. $ curl 'localhost:9200/accounts/person/_search'  -d ' 
  2.   "query": { 
  3.     "bool": { 
  4.       "must": [ 
  5.         { "match": { "desc""軟件" } }, 
  6.         { "match": { "desc""系統(tǒng)" } } 
  7.       ] 
  8.     } 
  9.   } 
  10. }' 

七、參考鏈接

ElasticSearch 官方手冊

A Practical Introduction to Elasticsearch

責任編輯:未麗燕 來源: 阮一峰的網(wǎng)絡日志
相關推薦

2018-12-28 09:48:11

SolrElasticSear搜索

2021-04-12 10:38:17

ElasticSearSolrJava

2014-11-25 10:09:59

ElasticSear分布式搜索引擎Lucene

2012-04-13 09:05:41

LuceneJava

2011-06-20 18:23:06

SEO

2017-01-17 15:18:42

2017-08-07 08:15:31

搜索引擎倒排

2018-07-20 09:42:23

Elasticsear實戰(zhàn)訂單

2020-03-20 10:14:49

搜索引擎倒排索引

2022-10-08 09:13:18

搜索引擎?站

2012-09-07 13:22:21

搜索搜狗

2009-02-19 09:41:36

搜索引擎搜狐百度

2010-04-20 11:43:46

2009-09-22 16:23:52

搜索引擎

2020-07-31 09:55:27

Linux分布式Elasticsear

2023-09-27 09:11:13

操作系統(tǒng)HTTP

2009-07-30 10:40:56

搜索引擎優(yōu)化網(wǎng)站

2023-02-08 10:45:23

2010-06-13 16:27:28

搜索引擎

2023-01-03 15:42:29

機器學習視頻搜索
點贊
收藏

51CTO技術棧公眾號