elasticsearch 介紹


一、什么是elasticsearch

  Elasticsearch是一個基於Lucene的高度可伸縮的分布式的開源全文搜索和分析引擎。它允許您快速、實時地存儲、搜索和分析大量數據。它通常用作底層引擎/技術,為具有復雜搜索特性和需求的應用程序提供支持。ElasticSearch是用java開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。

 

二、Elasticsearch的安裝和配置

  1、下載並解壓相應的安裝包,並配置ES_HOME下載鏈接貌似被屏蔽了,需要開代理下載。

  2、在bin目錄下啟動elasticsearch.bat 即可運行Elasticsearch,通過瀏覽器訪問localhost:9200如果返回一串json則說明啟動成功。

  

  3、上述的啟動ES是基於環境變量JAVA_HOME所指向的JDK,如果要自己指定飛環境變量的JDk可以在環境變量中配置ES_JDK,類似JAVA_HOME,然后修改ES的bin目錄下的

elasticsearch-env文件和elasticsearch-env.bat,具體修改如下

  

  

  4、創建ES服務(注意JAVA_HOME環境變量一定要設置成系統變量,不能設置為用戶系統變量,不然啟動會報錯,無法找到jvm.dll文件

  執行命令elasticsearch-server.bat start  就能將ES創建為windows服務,elasticsearch-server.bat相關的命令有

  install  將Elasticsearch作為服務安裝

  start   啟動Elasticsearch服務(如果已安裝)

     stop  停止Elasticsearch服務(如果啟動)

     remove  刪除已安裝的Elasticsearch服務(並在啟動時停止服務)

  manager  啟動一個GUI來管理已安裝的服務,可以設置服務的一些屬性和參數

  elasticsearch-server.bat manager 執行后的界面如下:如果要指向非JAVA_HOME 的jdk,那么可以修改下面的jvm.ddl

  

 

三、elasticsearch中的基本概念

  概述:

  在Elasticsearch中,包含多個索引(Index),相應的每個索引可以包含多個類型(Type),這些不同的類型每個都可以存儲多個文檔(Document),每個文檔又有多個屬性。一個索引索引 (index) 類似於傳統關系數據庫中的一個數據庫,是一個存儲關系型文檔的地方。 索引 (index) 的復數詞為 indices 或 indexes 。

  1、索引(index): ES將數據存儲於一個或多個索引中,索引是具有類似特性的文檔的集合。類比傳統的關系型數據庫領域來說,索引相當於SQL中的一個數據庫。索引由其名稱(必須為全小寫字符)進行標識,並通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。一個ES集群中可以按需創建任意數目的索引。

  2、類型(type):類型是索引內部的邏輯分區(category/partition),然而其意義完全取決於用戶需求。因此,一個索引內部可定義一個或多個類型(type)。一般來說,類型就是為那些擁有相同的域的文檔做的預定義。例如,在索引中,可以定義一個用於存儲用戶數據的類型,一個存儲日志數據的類型,以及一個存儲評論數據的類型。類比傳統的關系型數據庫領域來說,類型相當於“表”。

  3、文檔(document):文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,基於JSON格式進行表示。文檔由一個或多個域組成,每個域擁有一個名字及一個或多個值,有多個值的域通常稱為“多值域”。每個文檔可以存儲不同的域集,但同一類型下的文檔至應該有某種程度上的相似之處。

  4、映射(mapping):ES中,所有的文檔在存儲之前都要首先進行分析。用戶可根據需要定義如何將文本分割成token、哪些token應該被過濾掉,以及哪些文本需要進行額外處理等等。另外,ES還提供了額外功能,例如將域中的內容按需排序。事實上,ES也能自動根據其值確定域的類型。

   5、節點(node):運行了單個實例的ES主機稱為節點,它是集群的一個成員,可以存儲數據、參與集群索引及搜索操作。類似於集群,節點靠其名稱進行標識,默認為啟動時自動生成的隨機Marvel字符名稱。用戶可以按需要自定義任何希望使用的名稱,但出於管理的目的,此名稱應該盡可能有較好的識別性。節點通過為其配置的ES集群名稱確定其所要加入的集群。

  6、分片(shard):ES的“分片(shard)”機制可將一個索引內部的數據分布地存儲於多個節點,它通過將一個索引切分為多個底層物理的Lucene索引完成索引數據的分割存儲功能,這每一個物理的Lucene索引稱為一個分片(shard)。每個分片其內部都是一個全功能且獨立的索引,因此可由集群中的任何主機存儲。創建索引時,用戶可指定其分片的數量,默認數量為5個。

  7、副本(replica):Shard有兩種類型:primary和replica,即主shard及副本shard。Primary shard用於文檔存儲,每個新的索引會自動創建5個Primary shard,當然此數量可在索引創建之前通過配置自行定義,不過,一旦創建完成,其Primary shard的數量將不可更改。Replica shard是Primary Shard的副本,用於冗余數據及提高搜索性能。每個Primary shard默認配置了一個Replica shard,但也可以配置多個,且其數量可動態更改。ES會根據需要自動增加或減少這些Replica shard的數量。

 

四、ES相關度評分的理論

  1、bool模型:只是在查詢中使用 AND 、 OR 和 NOT (與、或和非)這樣的條件來查找匹配的文檔,這個過程簡單且快速,它將所有可能不匹配的文檔排除在外。

  2、詞頻/逆向文檔頻率(TF/IDF):當匹配到一組文檔后,需要根據相關度排序這些文檔,不是所有的文檔都包含所有詞,有些詞比其他的詞更重要。一個文檔的相關度評分部分取決於每個查詢詞在文檔中的 權重 。詞的權重由三個因素決定分別是:

    詞頻:詞在文檔中出現的頻率越高權重越高。

    逆向文檔率:詞在所有文檔中出現的頻率越高,權重越低。

    字段長度歸一值:字段越短,權重越高。

  3、向量空間模型:先將查詢條件根據詞的權重表示為向量a,然后為被查詢的每個文檔創建查詢詞向量b,a的b的夾角越小,相關度越高。

  

五、elasticsearch中主要的配置說明#集群的名稱,集群內的節點cluster.name必須相同

cluster.name: myElasticsearch
#節點名稱 node.name: node1
#配置當前節點是否具有可選為master節點的資格,默認值為true node.master: true
#配置當前節點是否允許存儲數據,默認值為true node.data: true
       master和data同時配置會產生一些奇異的效果:
        1) 當master為false,而data為true時,會對該節點產生嚴重負荷;
        2) 當master為true,而data為false時,該節點作為一個協調者;
        3) 當master為false,data也為false時,該節點就變成了一個負載均衡器。

#配置節點之間交互的端口 transport.tcp.port: 9300
#設置運行跨域訪問,默認為false http.cors.enabled: true
#設置跨域訪問的允許范圍 http.cors.allow-origin: "*"
#設置訪問這個節點的ip和該節點綁定的ip network.host: 192.168.0.1
#是否禁止HTTP http.enabled: false
#HTTP監聽的端口 http.port: 9200

#節點間交互時,可以設置是否壓縮,轉為為不壓縮:
transport.tcp.compress: true
#設置新節點被啟動時能夠發現的主節點列表(主要用於不同網段機器連接) discovery.zen.ping.unicast.hosts: ["192.168.0.1:9300", "192.168.0.1:9301"]
#配置索引的默認分片數,默認值為5 index.number_of_shards: 5
#配置索引的默認副本數,默認值為1 index.number_of_replicas: 1
#配置文件所在的位置,即elasticsearch.yml和logging.yml所在的位置 path.conf: /path/to/conf
#分配給當前節點的索引數據所在的位置 path.data: /path/to/data
#臨時文件位置 path.work: /path/to/work
#日志文件所在位置 path.logs: /path/to/logs
#插件安裝位置 path.plugins: /path/to/plugins

#設置內容的最大長度:
http.max_content_length: 100mb


 

 

六、將數據導入到elasticsearch

  1、外部的數據存儲在外部文件accounts.json中,里面的數據都是json格式,可以通過下面的命令來進行導入。

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/account/_bulk?pretty&refresh" --data-binary "@accounts.json"

{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane", "employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"} {"index":{"_id":"2"}} {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street", "employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}

 

  2、外部數據存儲在mysql中

    占位

 

七、配置elasticsearch集群

  1、下載elasticsearch的安裝包,並解壓3份,然后分別編輯它們的elasticsearch.yml配置文件,再分別啟動各個節點,它們會自動發現各個節點並組成集群。

  2、注意不要直接復制已經運行過的elasticsearch,因為已經運行的過程中已經產生了數據,所以配置集群后有可能無法鏈接節點,這個時候清空data目錄中的文件應該可以解決。

  #############node1####################


cluster.name: elasticsearch

node.name: node-1
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1
http.port: 9201
transport.tcp.port: 9301

discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301",  "127.0.0.1:9302", "127.0.0.1:9303"]

###############node2####################

cluster.name: elasticsearch

node.name: node-2
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1
http.port: 9202
transport.tcp.port: 9302

discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301",  "127.0.0.1:9302", "127.0.0.1:9303"]

#############node3########################

cluster.name: elasticsearch

node.name: node-3
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1 
http.port:
9203
transport.tcp.port:
9303
discovery.zen.ping.unicast.hosts: [
"127.0.0.1:9301", "127.0.0.1:9302", "127.0.0.1:9303"]

  集群搭建完成后可以來對集群狀態進行查看

 

   3、安裝head插件

    3.1、head插件是運行在node環境上的,安裝head插件前需要安裝node.js。

    3.2、下載elasticsearch-head-master.zip並解壓,然后以命令行的方式進入該文件夾使用npm install來安裝。

    3.3、安裝完成后在該目錄下會出現一個文件夾node_modules,進入該文件夾並執行npm run start 來運行。

    3.4、訪問http://localhost:9100/ 即可看到如下界面。

    

    4、集群中節點的分類

      4.1、主節點:首先要將節點設置為候選主節點,候選主節點的設置方法是設置node.mater為true,默認情況下,node.mater和node.data的值都為true。在集群啟動后各個節點會在候選節點中選舉一個主節點。主節點負責創建索引、刪除索引、分配分片、追蹤集群中的節點狀態等工作。

      4.2、數據節點:負責數據的存儲和相關具體操作,比如CRUD、搜索、聚合。所以,數據節點對機器配置要求比較高,首先需要有足夠的磁盤空間來存儲數據,其次數據操作對系統CPU、Memory和IO的性能消耗都很大。通常隨着集群的擴大,需要增加更多的數據節點來提高可用性。

      4.3、客戶端節點:負責請求的分發和匯總,本身並不存儲數據。請求的轉發和匯總這個功能本身主節點和數據節點也能完成這項工作,但是客戶端節點是專門來完成請求的分發和匯總,從而更好的實現負載均衡。

      4.4、協調節點:這是一個節點的角色,不管是主節點、數據節點還是客戶端節點,只要請求是由哪個節點進行分發和匯總,那么該節點就是承擔了協調節點的角色。協調節點對處理器和運行內存要求比較高,客戶端節點只能作為協調節點。

   5、分片

      5.1、主分片(Primary  Shard):是elasticsearch的最小存儲單元,一個index中的數據通常會存儲在多個分片中。默認情況下,elasticsearch會為每個index分為5個分片,可以通過配置文件中index.number_of_shards: 5來對分片數進行設置。分片並不是越多越好,雖然分片查詢時並行的,但是請求的分發和結果的合並都需要消耗時間和性能的,所以在數據量比較少的情況下,分片太多反而會降低效率。分片在創建index的時候就已經分配好,並且無法修改。

      5.2、復制分片(Replica Shard):主要是進行數據冗余來提高系統的可靠性。

   6、集群的狀態:

    Red,表示有主分片沒有分配,某些數據不可用。

    Yellow,表示主分片都已分配,數據都可用,但是有復制分片沒有分配。

    Green,表示主分片和復制分片都已分配,一切正常。

 

八、安裝和使用中文分詞器

  1、elasticsearch提供了一些內置的分詞器,並且默認是使用標准分詞器。

    1.1、standard analyzer(標准分詞器):去標點符號和停用詞,將句子直接分成單個字,並將大寫轉為小寫。

POST _analyze
{
  "analyzer": "standard",
  "text": "中國人,I am CHinese!"
}

...

{
   "tokens": [
      {
         "token": "",
         "start_offset": 0,
         "end_offset": 1,
         "type": "<IDEOGRAPHIC>",
         "position": 0
      },
      {
         "token": "",
         "start_offset": 1,
         "end_offset": 2,
         "type": "<IDEOGRAPHIC>",
         "position": 1
      },
      {
         "token": "",
         "start_offset": 2,
         "end_offset": 3,
         "type": "<IDEOGRAPHIC>",
         "position": 2
      },
      {
         "token": "i",
         "start_offset": 4,
         "end_offset": 5,
         "type": "<ALPHANUM>",
         "position": 3
      },
      {
         "token": "am",
         "start_offset": 6,
         "end_offset": 8,
         "type": "<ALPHANUM>",
         "position": 4
      },
      {
         "token": "chinese",
         "start_offset": 9,
         "end_offset": 16,
         "type": "<ALPHANUM>",
         "position": 5
      }
   ]
}

    1.2、simple analyzer(簡單分詞器):通過空格和標點符號來進行分詞,同時忽略標點符號、數字和停用詞,將大寫轉為小寫。

POST _analyze
{
  "analyzer": "simple",
  "text": "我是 中國人123,I am CHinese"
}

...

{
   "tokens": [
      {
         "token": "我是",
         "start_offset": 0,
         "end_offset": 2,
         "type": "word",
         "position": 0
      },
      {
         "token": "中國人",
         "start_offset": 3,
         "end_offset": 6,
         "type": "word",
         "position": 1
      },
      {
         "token": "i",
         "start_offset": 10,
         "end_offset": 11,
         "type": "word",
         "position": 2
      },
      {
         "token": "am",
         "start_offset": 12,
         "end_offset": 14,
         "type": "word",
         "position": 3
      },
      {
         "token": "chinese",
         "start_offset": 15,
         "end_offset": 22,
         "type": "word",
         "position": 4
      }
   ]
}

    1.3、whitespace analyzer(空格分詞器):顧名思義就是根據空格來進行分詞。

POST _analyze
{
  "analyzer": "whitespace",
  "text": "我是 中國人123,I am CHinese"
}

...

{
   "tokens": [
      {
         "token": "我是",
         "start_offset": 0,
         "end_offset": 2,
         "type": "word",
         "position": 0
      },
      {
         "token": "中國人123,I",
         "start_offset": 3,
         "end_offset": 11,
         "type": "word",
         "position": 1
      },
      {
         "token": "am",
         "start_offset": 12,
         "end_offset": 14,
         "type": "word",
         "position": 2
      },
      {
         "token": "CHinese",
         "start_offset": 15,
         "end_offset": 22,
         "type": "word",
         "position": 3
      }
   ]
}

    1.4、language analyzer(語言分詞器):elasticsearch內置了多種語言分詞器,如english、chinese等。但是分詞效果並不理想。

  

  2、安裝中文分詞器:

    2.1、下載比較常用的中文分詞器elasticsearch-analysis-ik-6.6.0.zip,注意一定要與elasticsearch的版本嚴格對應,一個小版本的區別都有可能使用不了。

    2.2、將解壓后的文件夾放入ES安裝目錄中的plugins目錄下,然后重啟ES就算安裝成功,注意集群中的每個節點都必須要對分詞器進行安裝

    2.3、ik分詞器有兩種分詞方式ik_smart 和ik_max_word ,前者是粗粒度拆分,后者是細粒度拆分

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "我是中國人,我愛中國"
}

...

{
   "tokens": [
      {
         "token": "",
         "start_offset": 0,
         "end_offset": 1,
         "type": "CN_CHAR",
         "position": 0
      },
      {
         "token": "",
         "start_offset": 1,
         "end_offset": 2,
         "type": "CN_CHAR",
         "position": 1
      },
      {
         "token": "中國人",
         "start_offset": 2,
         "end_offset": 5,
         "type": "CN_WORD",
         "position": 2
      },
      {
         "token": "",
         "start_offset": 6,
         "end_offset": 7,
         "type": "CN_CHAR",
         "position": 3
      },
      {
         "token": "",
         "start_offset": 7,
         "end_offset": 8,
         "type": "CN_CHAR",
         "position": 4
      },
      {
         "token": "中國",
         "start_offset": 8,
         "end_offset": 10,
         "type": "CN_WORD",
         "position": 5
      }
   ]
}
View Code

細粒度拆分:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "我是中國人,我愛中國"
}

...

{
   "tokens": [
      {
         "token": "",
         "start_offset": 0,
         "end_offset": 1,
         "type": "CN_CHAR",
         "position": 0
      },
      {
         "token": "",
         "start_offset": 1,
         "end_offset": 2,
         "type": "CN_CHAR",
         "position": 1
      },
      {
         "token": "中國人",
         "start_offset": 2,
         "end_offset": 5,
         "type": "CN_WORD",
         "position": 2
      },
      {
         "token": "中國",
         "start_offset": 2,
         "end_offset": 4,
         "type": "CN_WORD",
         "position": 3
      },
      {
         "token": "國人",
         "start_offset": 3,
         "end_offset": 5,
         "type": "CN_WORD",
         "position": 4
      },
      {
         "token": "",
         "start_offset": 6,
         "end_offset": 7,
         "type": "CN_CHAR",
         "position": 5
      },
      {
         "token": "",
         "start_offset": 7,
         "end_offset": 8,
         "type": "CN_CHAR",
         "position": 6
      },
      {
         "token": "中國",
         "start_offset": 8,
         "end_offset": 10,
         "type": "CN_WORD",
         "position": 7
      }
   ]
}
View Code

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM