1. 程式人生 > >全文搜尋引擎 Elasticsearch 入門教程

全文搜尋引擎 Elasticsearch 入門教程

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

它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫程式碼去呼叫它的介面。Elastic 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用。

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

一、安裝

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

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

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

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

 $ ./bin/elasticsearch 

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

 $ sudo sysctl -w vm.max_map_count=262144 

如果一切正常,Elastic 就會在預設的9200埠執行。這時,開啟另一個命令列視窗,請求該埠,會得到說明資訊。

 $ 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"
}

上面程式碼中,請求9200埠,Elastic 返回一個 JSON 物件,包含當前節點、叢集、版本等資訊。

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

預設情況下,Elastic 只允許本機訪問,如果需要遠端訪問,可以修改 Elastic 安裝目錄的config/elasticsearch.yml檔案,去掉network.host的註釋,將它的值改成0.0.0.0,然後重新啟動 Elastic。

 network.host: 0.0.0.0 

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

二、基本概念

2.1 Node 與 Cluster

Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。

單個 Elastic 例項稱為一個節點(node)。一組節點構成一個叢集(cluster)。

2.2 Index

Elastic 會索引所有欄位,經過處理後寫入一個反向索引(Inverted Index)。查詢資料的時候,直接查詢該索引。

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

下面的命令可以檢視當前節點的所有 Index。

 $ curl -X GET '[http://localhost](http://localhost/):9200/_cat/indices?v' 

2.3 Document

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

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

 
{
"user": "張三",
"title": "工程師",
"desc": "資料庫管理"
}

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

2.4 Type

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

不同的 Type 應該有相似的結構(schema),舉例來說,id欄位不能在這個組是字串,在另一個組是數值。這是與關係型資料庫的表的一個區別。性質完全不同的資料(比如products和logs)應該存成兩個 Index,而不是一個 Index 裡面的兩個 Type(雖然可以做到)。

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

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

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

三、新建和刪除 Index

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

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

伺服器返回一個 JSON 物件,裡面的acknowledged欄位表示操作成功。

 
{
"acknowledged":true,
"shards_acknowledged":true
}

然後,我們發出 DELETE 請求,刪除這個 Index。

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

四、中文分詞設定

首先,安裝中文分詞外掛。這裡使用的是 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 配合使用。

接著,重新啟動 Elastic,就會自動載入這個新安裝的外掛。

然後,新建一個 Index,指定需要分詞的欄位。這一步根據資料結構而異,下面的命令只針對本文。基本上,凡是需要搜尋的中文欄位,都要單獨設定一下。

 
$ 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"
        }
      }
    }
  }
}'

上面程式碼中,首先新建一個名稱為accounts的 Index,裡面有一個名稱為person的 Type。person有三個欄位。

  • user

  • title

  • desc

這三個欄位都是中文,而且型別都是文字(text),所以需要指定中文分詞器,不能使用預設的英文分詞器。

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

 "user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}

上面程式碼中,analyzer是欄位文字的分詞器,search_analyzer是搜尋詞的分詞器。ik_max_word分詞器是外掛ik提供的,可以對文字進行最大數量的分詞。

五、資料操作

5.1 新增記錄

向指定的 /Index/Type 傳送 PUT 請求,就可以在 Index 裡面新增一條記錄。比如,向/accounts/person傳送請求,就可以新增一條人員記錄。

 
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
  "user": "張三",
  "title": "工程師",
  "desc": "資料庫管理"
}'

伺服器返回的 JSON 物件,會給出 Index、Type、Id、Version 等資訊。

 
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":1,
"result":"created",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true
}

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

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

 $ curl -X POST 'localhost:9200/accounts/person' -d '
{
  "user": "李四",
  "title": "工程師",
  "desc": "系統管理"
}'

上面程式碼中,向/accounts/person發出一個 POST 請求,新增一個記錄。這時,伺服器返回的 JSON 物件裡面,_id欄位就是一個隨機字串。

 {
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_version":1,
"result":"created",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true
}

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

5.2 檢視記錄

向/Index/Type/Id發出 GET 請求,就可以檢視這條記錄。

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

上面程式碼請求檢視/accounts/person/1這條記錄,URL 的引數pretty=true表示以易讀的格式返回。

返回的資料中,found欄位表示查詢成功,_source欄位返回原始記錄。

 {
"_index" : "accounts",
"_type" : "person",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"user" : "張三",
"title" : "工程師",
"desc" : "資料庫管理"
}
}

如果 Id 不正確,就查不到資料,found欄位就是false。

 $ curl 'localhost:9200/weather/beijing/abc?pretty=true'
{
"_index" : "accounts",
"_type" : "person",
"_id" : "abc",
"found" : false
}

5.3 刪除記錄

刪除記錄就是發出 DELETE 請求。

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

這裡先不要刪除這條記錄,後面還要用到。

5.4 更新記錄

更新記錄就是使用 PUT 請求,重新發送一次資料。

 
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
    "user" : "張三",
    "title" : "工程師",
    "desc" : "資料庫管理,軟體開發"
}'

{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{"total":2,"successful":1,"failed":0},
"created":false
}

上面程式碼中,我們將原始資料從"資料庫管理"改成"資料庫管理,軟體開發"。 返回結果裡面,有幾個欄位發生了變化。

 
"_version" : 2,
"result" : "updated",
"created" : false

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

六、資料查詢

6.1 返回所有記錄

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

 
$ 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": "系統管理"
}
},
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_score":1.0,
"_source": {
"user" : "張三",
"title" : "工程師",
"desc" : "資料庫管理,軟體開發"
}
}
]
}
}

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

  • total:返回記錄數,本例是2條。

  • max_score:最高的匹配程度,本例是1.0。

  • hits:返回的記錄組成的陣列。

返回的記錄中,每條記錄都有一個_score欄位,表示匹配的程式,預設是按照這個欄位降序排列。

6.2 全文搜尋

Elastic 的查詢非常特別,使用自己的查詢語法,要求 GET 請求帶有資料體。

 
$ curl 'localhost:9200/accounts/person/_search' -d '
{
  "query" : { "match" : { "desc" : "軟體" }}
}'

上面程式碼使用 Match 查詢,指定的匹配條件是desc欄位裡面包含"軟體"這個詞。返回結果如下。

 {
"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" : "資料庫管理,軟體開發"
}
}
]
}
}

Elastic 預設一次返回10條結果,可以通過size欄位改變這個設定。

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

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

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

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

上面程式碼指定,從位置1開始(預設是從位置0開始),只返回一條結果。

6.3 邏輯運算

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

 
$ curl 'localhost:9200/accounts/person/_search' -d '
{
  "query" : { "match" : { "desc" : "軟體 系統" }}
}'

上面程式碼搜尋的是軟體 or 系統。

如果要執行多個關鍵詞的and搜尋,必須使用布林查詢。

 $ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "軟體" } },
        { "match": { "desc": "系統" } }
      ]
    }
  }
}'

七、參考連結

  • ElasticSearch 官方手冊 (https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html)

  • A Practical Introduction to Elasticsearch (https://www.elastic.co/blog/a-practical-introduction-to-elasticsearch)

相關推薦

全文搜尋引擎 Elasticsearch 入門教程-Index

前言: 之前已經說過最近正在做資料建設,爬取資料之後經過處理,最終匯入到ElasticSearch中,並編寫公共介面以提供給後臺進行檢索操作;本來想等把ElasticSearch官方API都看過一遍,形成思維導圖之後再整理出來,因為熟悉一個工具,它能做到的,比你知道它能做到的要全面也重要的多,但是整理了兩章之

全文搜尋引擎 Elasticsearch 入門教程

全文搜尋屬於最常見的需求,開源的 Elasticsearch (以下簡稱 Elastic)是目前全文搜尋引擎的首選。 它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。Elastic 的底層是開源庫 Lucene。但

全文搜尋引擎Elasticsearch入門教程

$ curl 'localhost:9200/accounts/person/_search'{  "took":2,  "timed_out":false,  "_shards":{"total":5,"successful":5,"failed":0},  "hits":{    "total":2,  

全文搜索引擎 Elasticsearch 入門教程

config har tle 如果 數量 date cse 返回 寫入 全文搜索屬於最常見的需求,開源的 Elast

全文搜尋引擎 Elasticsearch 教程

全文搜尋屬於最常見的需求,開源的 Elasticsearch (以下簡稱 Elastic)是目前全文搜尋引擎的首選。 它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。 Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene

全文搜尋引擎ElasticSearch新手實戰教程

全文搜尋 屬於最常見的需求,開源的 ElasticSearch (以下簡稱 Elastic)是目前全文搜尋引擎的首選。 它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。 Elastic 的底層是開源庫 Lucene 。但是,你沒法直接用 Luc

ES篇:全文搜尋引擎 Elasticsearch

全文搜尋屬於最常見的需求,開源的 Elasticsearch (以下簡稱 Elastic)是目前全文搜尋引擎的首選。 它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。 Elastic 的底層是開源庫 L

全文搜尋引擎——Elasticsearch

 Elasticsearch 開源的 Elasticsearch 是目前全文搜尋引擎的首選。 它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。 Elasticsearch 的底層是開源庫 Lucene。但是,你

分散式搜尋引擎ElasticSearch——入門知識

什麼是ElasticSearch ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分 布式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發 的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎

全文搜尋引擎 ElasticSearch 還是 Solr?

最近專案組安排了一個任務,專案中用到了全文搜尋,基於全文搜尋 Solr,但是該 Solr 搜尋雲專案不穩定,經常查詢不出來資料,需要手動全量同步,而且是其他團隊在維護,依賴性太強,導致 Solr 服務一出問題,我們的專案也基本癱瘓,因為所有的依賴查詢都無結果資料了。所以考慮開發一個適配層,如果 Solr 搜尋

全文搜尋引擎ElasticSearch初使用

一、Docker下安裝ElasticSearch 1、在Docker映象倉庫中,搜尋ElasticSearch映象 docker search elasticsearch 2、Docker下安裝ElasticSearch docker pull registry.

Elasticsearch入門教程(一):Elasticsearch及外掛安裝

一:安裝Elasticsearch 下載並解壓Elasticsearch 直接到官網(https://www.elastic.co/cn/downloads/elasticsearch)下載適合自己的系統的Elasticsearch,這裡下載的是目前最新的

全文搜尋引擎 Elasticsearch

寫在前面 最近在學Elasticsearch , 我相信只要是接觸過開發的都會聽過Elasticsearch或ELK這麼一個技術。 主要用來做全文檢索或大資料分析等,之前一直處理了解狀態。 所以打算系統學學Elasticsearch ,這也算是我從零學習Elasticsearch的筆記吧。 1. Elasti

全文搜尋引擎ElasticSearch

1. 介紹  ElasticSearch簡稱ES。  先來看它的用途:如果只是在多個機器同步,儲存和檢索大量資料,它與資料庫的差別在哪兒,為什麼非要使用ES呢?  ES是目前全文搜尋引擎的首選。全文檢索是指計算機索引程式通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明

C呼叫libcurl庫函式 查詢全文搜尋引擎 Elasticsearch

//執行在ubuntu64系統下//curles.c#include <stdio.h>#include <curl/curl.h>#include <string.h>size_t write_data(void *ptr, size_t

搜尋引擎ElasticSearch入門

#### 前言 最近專案上需要用到搜尋引擎,由於之前自己沒有了解過,所以整理了一下搜尋引擎的相關概念知識。 #### 正文 想查資料就免不了搜尋,搜尋就離不開搜尋引擎,百度、谷歌都是一個非常龐大複雜的搜尋引擎,他們幾乎索引了網際網路上開放的所有網頁和資料。然而對於我們自己的業務資料來說,肯定就沒必要用這

elasticsearch索引快速入門-實時全文搜尋引擎

一.es是什麼   Search & Analyze Data in Real Time   核心的功能就是搜尋,全文搜尋框架,接近實時的搜尋強力搜尋引擎依賴Lucene,新上傳,修改的索引同步速度接近實時 優勢: 1.分散式,水平擴容,高可用 2.實時

Elasticsearch全文檢索工具入門

使用步驟 artifact rop 創建 是否 方式 cluster 包名 Lucene 1 Elasticsearch全文檢索工具入門: 2 1.下載對應系統版本的文件 3 elasticsearch-2.4.0.zip 4

14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch視頻教程

http soft 精品 target mysql rocket body 精通 ava 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful服務,並發原理編程,SpringBoot,SpringClo

PHP-elasticsearch配置+基於elasticsearch全文搜尋引擎的開發小結

首先參照官網內容下載與自己php以及elasticsearch版本相匹配的Php-elasticsearch,按照官網內容進行配置https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.ht