天天看點

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

ElasticSearch學習

  • 一、搜尋與ElasticSearch
    • 1、什麼是搜尋
    • 2、資料庫搜尋
    • 3、什麼是全文檢索和Lucene
    • 4、什麼是ElasticSearch
    • 5、ElasticSearch的功能、适用場景、特點
    • 6、ElasticSearch的核心概念
    • 7、ElasticSearch、Kibana的安裝、啟動(兩者版本要一樣)
  • 二、快速入門案例實戰之電商網站商品管理
    • 1、叢集健康檢查、 CRUD操作(所有指令區分大小寫)
    • 2、多種搜尋方式

一、搜尋與ElasticSearch

1、什麼是搜尋

   在任何場景下,找尋你想要的資訊,這個時候,會輸入一段你要搜尋的關鍵字,然後就期望找到這個關鍵字相關的有些資訊

2、資料庫搜尋

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

缺點:

   1)每條記錄的指定字段文本可能會很長,需要對每條記錄的所有文本進行掃描,來判斷說是否符合;太耗時耗資源

   2)還不能将搜尋詞拆分開來;比如輸入“生化機”,就搜尋不出來“生化危機”

3、什麼是全文檢索和Lucene

   1)全文檢索:

反向索引

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

   2)lucene:

就是一個jar包

;裡面包含了封裝好的各種建立反向索引,以及進行搜尋的代碼,包括各種算法。我們就用java開發的時候,引入lucene jar,然後基于lucene的api進行去進行開發就可以了。用lucene,我們就可以去将已有的資料建立索引,lucene會在本地磁盤上面,給我們組織索引的資料結構。另外的話,我們也可以用lucene提供的一些功能和api來針對磁盤上的索引資料來進行搜尋

4、什麼是ElasticSearch

   一個分布式,高性能,高可用,可伸縮的

搜尋和分析系統

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

5、ElasticSearch的功能、适用場景、特點

   1)ElasticSearch的功能:

     (1)分布式的搜尋引擎和資料分析引擎

     (2)全文檢索,結構化檢索,資料分析

     (3)對海量資料進行近實時的處理

   2)ElasticSearch的适用場景:

     (1)百度百科

     (2)新聞網站

     (3)電商網站

         。

         。

         。

   3)ElasticSearch的特點:

     (1)可作為

分布式叢集

,也可作為

單機

服務小系統

     (2)

并非新技術

,而是将全文檢索、分布式、資料分析等技術合并在一起的一種技術;如同SpringCloud

     (3)對使用者來說,是可以

開箱即用

的;部署簡單,操作簡單

     (4)提供了傳統資料庫所欠缺的一些功能;如:近實時性、海量資料、資料分析、全文檢索、同義詞處理、相關度排名等等

6、ElasticSearch的核心概念

   1)Lucene和ElasticSearch的前世今生:

     (1)Lucene:最先進、功能最強大的搜尋庫,直接基于Lucene開發,非常複雜,api複雜(實作一些簡單的功能,寫大量的java代碼),需要深入了解原理(各種索引結構)

     (2)ElasticSearch:

基于Lucene

,隐藏複雜性,提供簡單易用的restful api接口、java api接口(還有其他語言的api接口)

       分布式的文檔存儲引擎

       分布式的搜尋引擎和分析引擎

       分布式,支援PB級資料

       開箱即用,優秀的預設參數,

不需要任何額外設定,完全開源

  關于Elasticsearch的一個 傳說 (發展):

     有一個程式員失業了,陪着自己老婆去英國倫敦學習廚師課程。程式員在失業期間想給老婆寫一個菜單搜尋引擎,覺得Lucene實在太複雜了,就開發了一個封裝了Lucene的開源項目,Compass。後來程式員找到了工作,是做分布式的高性能項目的,覺得Compass不夠,就寫了ElasticSearch,讓Lucene變成分布式的系統。

   2)ElasticSearch的

核心概念

     (1)Near Realtime(NRT):近實時;兩個意思:從寫入資料到資料可以被搜尋到有一個小延遲(大概1秒),基于es執行搜尋和分析可以達到秒級

近實時第一種情況的圖解

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

     (2)Cluster:

叢集

,包含多個節點,每個節點屬于哪個叢集是通過一個配置(叢集名稱,預設是elasticsearch)來決定的,對于中小型應用來說,剛開始一個叢集就一個節點很正常

     (3)Node:

節點

,叢集中的一個節點,節點也有一個名稱(預設是随機配置設定的),節點名稱很重要(在執行運維管理操作的時候),預設節點會去加入一個名稱為“elasticsearch”的叢集,如果直接啟動一堆節點,那麼它們會自動組成一個ElasticSearch叢集,當然一個節點也可以組成一個ElasticSearch叢集

     (4)Document & Field:

文檔 & 字段

,es中的最小資料單元,一個Document可以是一條客戶資料,一條訂單資料,通常用JSON結構表示。一個Document裡有多個Field,每個Field就是一個資料字段。

     (5)Index:

索引

,包含一堆有相似結構的文檔資料,比如可以有一個客戶索引,訂單索引。一個Index包含很多Document,一個Index就代表了一類類似的或者相同的Document。

     (6)Type:

類型,es7.x版本中被移除了此概念

。每個索引裡都可以有一個或多個Type,Type是Index中的一個邏輯資料分類,一個Type下的Document,都有相同的Field。比如部落格系統,有一個索引,可以定義使用者資料Type,部落格資料Type,評論資料Type。

    商品Type可以有:日化商品Type,電器商品Type,生鮮商品Type

      日化商品Type:product_id,product_name,product_desc,category_id,category_name

      電器商品Type:product_id,product_name,product_desc,category_id,category_name,service_period

      生鮮商品Type:product_id,product_name,product_desc,category_id,category_name,eat_period

   每一個Type裡面,都會包含一堆Document

     (7)Shard:

本名為Primary Shard

。單台機器無法存儲大量資料,es可以将一個索引中的資料切分為多個Shard,分布在多台伺服器上存儲。有了Shard就可以橫向擴充,存儲更多資料,讓搜尋和分析等操作分布到多台伺服器上去執行,提升吞吐量和性能。

     (8)Replica:

本名為Replica Shard

。任何一個伺服器随時可能故障或當機,此時Shard可能就會丢失,是以可以為每個Shard建立多個Replica副本。Replica可以在Shard故障時提供備用服務,保證資料不丢失,多個Replica還可以提升搜尋操作的吞吐量和性能。Primary Shard(建立索引時一次設定,不能修改,預設5個),Replica Shard(随時修改數量,預設1個),預設每個索引10個Shard,5個Primary Shard,5個Replica Shard,

最小的高可用配置,是2台伺服器

Shard 與 Replica 的圖解

ElasticSearch快速入門一、搜尋與ElasticSearch二、快速入門案例實戰之電商網站商品管理

   3)ElasticSearch與資料庫的概念比較:

ElasticSearch 資料庫
Field 字段
Document
Type
Index

7、ElasticSearch、Kibana的安裝、啟動(兩者版本要一樣)

   1)安裝JDK,至少1.8.0_73以上版本,java -version

   2)下載下傳和解壓縮ElasticSearch安裝包,目錄結構

   3)啟動Elasticsearch:進入ElasticSearch檔案的bin路徑下,運作

elasticsearch.bat

。es本身特點之一就是開箱即用,如果是中小型應用,資料量少,操作不是很複雜,直接啟動就可以用了

   4)檢查ES是否啟動成功:http://localhost:9200/?pretty

     name: 節點名稱

     cluster_name: 叢集名稱(預設的叢集名稱就是elasticsearch)

     version.number: es版本号

{
    "name": "4onsTYV",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "nKZ9VK_vQdSQ1J0Dx9gx1Q",
    "version": {
        "number": "5.2.0",
        "build_hash": "24e05b9",
        "build_date": "2017-01-24T19:52:35.800Z",
        "build_snapshot": false,
        "lucene_version": "6.4.0"
    },
    "tagline": "You Know, for Search"
}
           

   5)修改叢集名稱:config檔案夾的

elasticsearch.yml

檔案

   6)下載下傳和解壓縮Kibana安裝包,使用裡面的開發界面,去操作ElasticSearch,作為我們學習es知識點的一個主要的界面入口

   7)啟動Kibana:進入Kibana檔案的bin路徑下,運作

kibana.bat

   8)進入Dev Tools界面:http://localhost:5601

   9)GET _cluster/health:擷取ElasticSearch的運作健康狀況

二、快速入門案例實戰之電商網站商品管理

1、叢集健康檢查、 CRUD操作(所有指令區分大小寫)

   1)Document資料格式:

json格式

     (1)應用系統的資料結構都是面向對象的,複雜的

     (2)對象資料存儲到資料庫中,隻能拆解開來,變為扁平的多張表,每次查詢的時候還得還原回對象格式,相當麻煩

     (3)ES是面向文檔的,文檔中存儲的資料結構,與面向對象的資料結構是一樣的,基于這種文檔資料結構,ES可以提供複雜的索引,全文檢索,分析聚合等功能

     (4)ES的Document用json資料格式來表達

   2)電商網站商品管理案例背景介紹:

    有一個電商網站,需要為其基于ES建構一個背景系統,提供以下功能:

     (1)對商品資訊進行CRUD(增删改查)操作

     (2)執行簡單的結構化查詢

     (3)可以執行簡單的全文檢索,以及複雜的phrase(短語)檢索

     (4)對于全文檢索的結果,可以進行高亮顯示

     (5)對資料進行簡單的聚合分析

   3)簡單的叢集管理

     (1)快速檢查叢集的健康狀況:

  • ES提供了一套api,叫做

    cat api

    ,可以檢視ES中各種各樣的資料

      

    GET /_cat/health?v

      如何快速了解叢集的健康狀況?

    green、yellow、red

        green:每個索引的Primary Shard和Replica Shard都是啟動活躍(active)狀态的

        yellow:每個索引的Primary Shard都是啟動活躍(active)狀态的,但是部分Replica Shard不是啟動活躍(active)狀态,處于不可用的狀态

        red:不是所有索引的Primary Shard都是啟動活躍(active)狀态的,部分索引有資料丢失了

      5.x版本:啟動一個ES,預設生成

    一個

    索引;

    要求需要

    有Replica Shard

      7.x版本:啟動一個ES,預設生成

    三個

    索引;

    不需要

    有Replica Shard

   啟動一台ES:用shards(即Shards)減去pri(Primary Shard),就是Replica Shard。

三者均為實際啟動了的

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1584755228 01:47:08 elasticsearch green 1 1 3 3 - 100.0%

   啟動涼台ES:用shards(即Shards)減去pri(Primary Shard),就是Replica Shard。

三者均為實際啟動了的

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1584756567 02:09:27 elasticsearch green 2 3 6 3 - 100.0%
  • 快速檢視叢集中的索引:

    GET /_cat/indices?v

       啟動一台ES:用pri(Primary Shard)加上rep(Replica Shard),就是Shards。

    三者均為需要啟動的

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_task_manager_1 UNGZfmkTRE-izXImlR-qow 1 2 1 26.8kb 26.8kb
green open .apm-agent-configuration SOvLxZQfTWKQJrd1eRo-sw 1 283b 283b
green open .kibana_1 V4X36I1ZQ3-wZozP2JPMUQ 1 22 10 47.6kb 47.6kb

   啟動兩台ES:用pri(Primary Shard)加上rep(Replica Shard),就是Shards。

三者均為需要啟動的

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_task_manager_1 UNGZfmkTRE-izXImlR-qow 1 1 2 1 53.7kb 26.8kb
green open .apm-agent-configuration SOvLxZQfTWKQJrd1eRo-sw 1 1 283b 283b
green open .kibana_1 V4X36I1ZQ3-wZozP2JPMUQ 1 1 22 10 101.9kb 50.9kb
  • 簡單的索引操作

       建立索引:

    PUT /test_index?pretty

       删除索引:

    DELETE /test_index?pretty

       4)Document的CRUD操作:

         (1)新增Document:ES會

    自動建立

    index,不需要提前建立,而且ES預設會對Document每個Field都

    建立反向索引

    ,讓其可以被搜尋
PUT /{index}/_doc/{id}
{
  	"json資料"
}
           

     (2)删除Document:

DELETE /{index}/_doc/{id}

     (3)修改Document:

       替換Document:替換方式有一個不好,即使

必須帶上所有的Field

,才能去進行資訊的修改

PUT /{index}/_doc/{id}
{
  	"json資料"
}
           

       更新Document:

POST /{index}/_doc/{id}
{
  	"json資料"
}
           

     (4)查詢Document:

GET /{index}/_doc/{id}

2、多種搜尋方式

  

事先了解搜尋的結果結構

     took:耗費了幾毫秒

     timed_out:是否逾時,這裡是沒有

     _shards:資料拆成了1個分片,是以對于搜尋請求,會打到所有的Primary Shard(或者是它的某個Replica Shard也可以)

     hits.total:查詢結果的數量,1個Document

     hits.max_score:score的含義,就是Document對于一個search的相關度的比對分數,越相關,就越比對,分數也高

     hits.hits:包含了比對搜尋的Document的詳細資料

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "test_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "name": "chengqb",
                    "desc": "ceshi",
                    "price": 30,
                    "producer": "gaolujie producer",
                    "tags": [
                        "meibai",
                        "fangzhu"
                    ]
                }
            }
        ]
    }
}
           

   1)query string search:

适用于指令行界面

    

GET /{index}/_search

     參數處理:search參數都是以http請求的query string來附帶的

     如:搜尋商品名稱中包含yagao的商品,而且按照售價降序排序:

      

GET /{index}/_search?q=name:yagao&sort=price:desc

     适用場景:适用于臨時的在指令行使用一些工具,比如curl,快速的送出請求,來檢索想要的資訊;但是如果查詢請求很複雜,是很難去建構的

     在生産環境中,

幾乎很少使用query string search

   2)query DSL:

适用于生産環境

    

DSL

:Domain Specified Language,特定領域的語言

    

http request body

:請求體,可以用json的格式來建構查詢文法,比較友善,可以建構各種複雜的文法

  • 查詢所有Document

GET /{index}/_search
{
  	"query": { "match_all": {} }
}
           
  • 條件查詢并排序

GET /{index}/_search
{
    "query" : {
        "match" : {
            			{Field} : {value}
        }
    },
    "sort": [
       			 {
   {Field} : "desc" / "asc"
    }
    ]
}
           
  • 分頁查詢

GET /{index}/_search
{
  "query": { "match_all": {} },
  "from": {value},
  "size": {value}
}
           
  • 指定傳回字段

GET /{index}/_search
{
  "query": { "match_all": {} },
  "_source": [{Field}]
}
           

   3)query filter:

GET /{index}/_search
{
    "query" : {
        "bool" : {
            "must" : {
                "match" : {
                 {Field} : {value}
                }
            },
            "filter" : {
                "range" : {
                 {Field} : { "gt" : {value}} 
                }
            }
        }
    }
}
           

   4)full-text search(全文檢索):

建立反向索引,搜尋詞也會被拆解,可以隻包含被拆解後的幾部分(一部分以上)

GET /{index}/_search
{
    "query" : {
        "match" : {
           {Field} : {value} 
        }
    }
}
           

   5)phrase search(短語搜尋):

搜尋詞不會被拆解,必須包含一模一樣的

GET /{index}/_search
{
    "query" : {
        "match_phrase" : {
           {Field} : {value} 
        }
    }
}
           

   6)highlight search(高亮搜尋):

高亮搜尋結果

GET /{index}/_search
{
    "query" : {
        "match" : {
          {Field} : {value} 
        }
    },
    "highlight": {
        "fields" : {
          {Field} : {}
        }
    }
}
           

繼續閱讀