1. 程式人生 > >Elasticsearch全文搜尋引擎淺析

Elasticsearch全文搜尋引擎淺析

簡介:

         Elastic 的底層是開源庫Luence。但是,你沒法直接用 Lucene,必須自己寫程式碼去呼叫它的介面。Elastic 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用。Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。搜尋引擎在對資料構建索引時,需要進行分詞處理。分詞是指將一句話拆解成多個單字或詞,這些字或詞便是這句話的關鍵詞。如

設定遠端訪問:

        預設情況下,Elastic 只允許本機訪問,如果需要遠端訪問,可以修改 Elastic 安裝目錄的config/elasticsearch.yml

檔案,去掉network.host的註釋,將它的值改成0.0.0.0,然後重新啟動 Elastic。線上服務不要這樣設定,要設成具體的 IP。

安裝中文分詞外掛:

      Elasticsearch 不支援對中文進行分詞建立索引,需要配合擴充套件elasticsearch-analysis-ik來實現中文分詞處理。,也可以考慮其他外掛(比如 smartcn)。

基本概念:

1.Node 與 Cluster:

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

2.Index:

curl -X GET 'http://localhost:9200/_cat/indices?v'    #當前節點的所有 Index

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

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

3.Document:

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

4.Type:

$ curl 'localhost:9200/_mapping?pretty=true'   #列出每個 Index 所包含的 Type。

  Document 可以分組,比如weather這個 Index 裡面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。不同的 Type 應該有相似的結構(schema),舉例來說,id

欄位不能在這個組是字串,在另一個組是數值。這是與關係型資料庫的表的一個區別。性質完全不同的資料(比如productslogs)應該存成兩個 Index,而不是一個 Index 裡面的兩個 Type(雖然可以做到)。

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

資料的操作:

1.新增資料:

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

$ curl -X PUT 'localhost:9200/accounts/perople/1' -d '
{
  "user": "李四",
  "title": "建築師",
  "desc": "資料庫管理"
}'

2.刪除資料:

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

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

3.更新資料:

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

$ curl -X PUT 'localhost:9200/accounts/people/1' -d '
{
    "user" : "李四",
    "title" : "建築師",
    "desc" : "資料庫管理,軟體開發"
}' 

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

4.查詢資料:

使用 GET 方法,直接請求/accounts/people/search,就會返回所有記錄。

$ curl 'localhost:9200/accounts/people/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" : "資料庫管理,軟體開發"
        }
      }
    ]
  }
}

5.全文搜尋:

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

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "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.邏輯運算:

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

$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "匹配條件一 匹配條件二" }}
}'

上面程式碼搜尋的是 匹配條件一 or 匹配條件二。

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

$ curl 'localhost:9200/accounts/people/search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "匹配條件一" } },
        { "match": { "desc": "匹配條件二" } }
      ]
    }
  }
}'

參考連結: