瞭解一下Elasticsearch的基本概念

1、前文介紹

Elasticsearch(簡稱ES)是一個基於Apache Lucene(TM)的開源搜索引擎,不管在開源仍是專有領域,Lucene 能夠被認爲是迄今爲止最早進、性能最好的、功能最全的搜索引擎庫。注意,Lucene 只是一個庫。想要發揮其強大的做用,你需使用 Java 並要將其集成到你的應用中。mysql

Lucene 很是複雜,你須要深刻的瞭解檢索相關知識來理解它是如何工做的,就跟學習 springmvc 以前先從 servlet 開始,繁瑣複雜的工做,Solor、Elasticsearch 應由而生, 其使用 Java 編寫並使用 Lucene 來創建索引並實現搜索功能,可是它的目的是經過簡單連貫的 RESTful API 讓全文搜索變得簡單並隱藏 Lucene 的複雜性。nginx

重要特性:git

  • 分佈式的實時文件存儲,每一個字段都被索引並可被搜索
  • 實時分析的分佈式搜索引擎
  • 能夠擴展到上百臺服務器,處理PB級結構化或非結構化數據

基本概念:github

索引(indices)-------------------Databases 數據庫
類型(type)----------------------Table 數據表
文檔(Document)---------------Row 行
字段(Field)---------------------Columns 列spring

詳細說明:sql

概念 說明
索引庫(indices) indices是index的複數,表明許多的索引,
類型(type) 類型是模擬mysql中的table概念,一個索引庫下能夠有不一樣類型的索引,好比商品索引,訂單索引,其數據格式不一樣。不過這會致使索引庫混亂,所以將來版本中會移除這個概念
文檔(document) 存入索引庫原始的數據。好比每一條商品信息,就是一個文檔
字段(field) 文檔中的屬性
映射配置(mappings) 字段的數據類型、屬性、是否索引、是否存儲等特性

要注意的是:Elasticsearch 自己就是分佈式的,所以即使你只有一個節點,Elasticsearch 默認也會對你的數據進行分片和副本操做,當你向集羣添加新數據時,數據也會在新加入的節點中進行平衡。數據庫

2、Elasticsearch安裝[windows]

以下主要針對 windows 環境下的 Elasticsearch 學習。apache

下載地址:https://www.elastic.co/cn/products/編程

解壓後,進入 bin/ 目錄,雙擊執行 elasticsearch .batjson

Elasticsearch 啓動後能夠看到綁定了兩個端口:

  • 9300:集羣節點間通信接口【tcp鏈接方式,性能優於http】
  • 9200:客戶端訪問接口【接收http請求】

9200,咱們能夠經過瀏覽器直接訪問,9300 則不能夠直接訪問。

3、Kibana 安裝

Kibana 是一個基於 Node.js 的 Elasticsearch 索引庫數據統計工具,能夠利用 Elasticsearch 的聚合功能,生成各類圖表,如柱形圖,線狀圖,餅圖等。

並且還提供了操做 Elasticsearch 索引數據的控制檯,而且提供了必定的API提示,很是有利於咱們學習 Elasticsearch 的語法。

一、配置

咱們能夠把 Kibana 當成,durid 鏈接池對於 mysql 的可視化來理解。

下載地址:https://www.elastic.co/cn/downloads/kibana

解壓後,進入安裝目錄下的 config 目錄,修改 kibana.yml 文件:

修改elasticsearch服務器的地址,去掉原來的註釋:

elasticsearch.url: "http://localhost:9200"

Kibana 的監聽端口爲 5601:http://127.0.0.1:5601 瀏覽器打開以下圖所示:

Dev Tools 至關於一個命令行窗口工具,帶提示,Elasticsearch 執行的數據格式爲 json,舉例:

POST _analyze
{
  "analyzer""ik_max_word",
  "text":     "我喜歡編程"
}

4、ik 分詞器安裝

因爲 Elasticsearch 在拆分單詞時,是按空格來分,即 hello world 分爲 hello 和 world,這是沒問題的,可是在拆分中文時也是按照一個漢字一個漢字來拆分。即「我喜歡編程」分爲 我、喜、歡、編、程 5個字符,因此就須要用到 IK 分詞器這個插件來進行拆分。

Lucene 的 IK 分詞器早在 2012 年已經沒有維護了,如今咱們要使用的是在其基礎上維護升級的版本,而且開發爲 ElasticSearch 的集成插件了,與 Elasticsearch 一塊兒維護升級,版本也保持一致。

IK下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

注意 ES 與 IK 版本對應地址:https://github.com/medcl/elasticsearch-analysis-ik/tree/2.x

將 zip 包,解壓到 Elasticsearch 目錄的 plugins 目錄中:

而後重啓 Elasticsearch

5、基本概念-詳細瞭解

上文也瞭解到 ES 操做的數據爲 json,實際項目中,好比 springboot 中,無須操做 json,都是面向對象編程,可是,學習其實際原理當然重要。

5.一、建立索引

建立索引的請求格式:

  • 請求方式:PUT
  • 請求路徑:/索引庫名
  • 請求參數:json格式:
{
   "settings": {
      "number_of_shards"3,
      "number_of_replicas"2
   }
}
  • settings:索引庫的設置
  • number_of_shards: 分片數量
  • number_of_replicas:副本數量

示例:

5.二、查看索引設置

語法

Get請求能夠幫咱們查看索引信息,格式:

GET /索引庫名
5.三、刪除索引

刪除索引使用DELETE請求

語法

DELETE /索引庫名

6、映射配置

6.一、建立映射字段

語法

請求方式依然是PUT

PUT /索引庫名/_mapping/類型名稱
{
  "properties": {
    "字段名": {
      "type""類型",
      "index"true
      "store"true
      "analyzer""分詞器"
    }
  }
}
  • 類型名稱:就是前面將的type的概念,相似於數據庫中的不一樣表
    字段名:任意填寫 ,能夠指定許多屬性,例如:
  • type:類型,能夠是text、long、short、date、integer、object等
  • index:是否索引,默認爲true
  • store:是否存儲,默認爲false
  • analyzer:分詞器,這裏的ik_max_word即便用ik分詞器

示例

發起請求:

PUT niceyoo2/_mapping/goods
{
  "properties": {
    "title": {
      "type""text",
      "analyzer""ik_max_word"
    },
    "images": {
      "type""keyword",
      "index""false"
    },
    "price": {
      "type""float"
    }
  }
}

響應結果:

{
  "acknowledged"true
}
6.二、查看映射關係

語法:

GET /索引庫名/_mapping

示例:

GET /niceyoo2/_mapping

響應:

{
  "niceyoo2": {
    "mappings": {
      "goods": {
        "properties": {
          "images": {
            "type""keyword",
            "index"false
          },
          "price": {
            "type""float"
          },
          "title": {
            "type""text",
            "analyzer""ik_max_word"
          }
        }
      }
    }
  }
}

7、字段屬性詳解

7.一、type

Elasticsearch 中支持的數據類型很是豐富:

咱們說幾個關鍵的:

String類型,又分兩種:

  • text:可分詞,不可參與聚合
  • keyword:不可分詞,數據會做爲完整字段進行匹配,能夠參與聚合

Numerical:數值類型,分兩類:

  • 基本數據類型:long、interger、short、byte、double、float、half_float
  • 浮點數的高精度類型:scaled_float
    • 須要指定一個精度因子,好比10或100。elasticsearch會把真實值乘以這個因子後存儲,取出時再還原。

Date:日期類型

elasticsearch 能夠對日期格式化爲字符串存儲,可是建議咱們存儲爲毫秒值,存儲爲 long,節省空間。

7.二、index

index影響字段的索引狀況。

  • true:字段會被索引,則能夠用來進行搜索。默認值就是true
  • false:字段不會被索引,不能用來搜索

index的默認值就是true,也就是說你不進行任何配置,全部字段都會被索引。

可是有些字段是咱們不但願被索引的,好比商品的圖片信息,就須要手動設置index爲false。

7.三、store

是否將數據進行額外存儲。

在學習lucene和solr時,咱們知道若是一個字段的store設置爲false,那麼在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。

可是在Elasticsearch中,即使store設置爲false,也能夠搜索到結果。

緣由是Elasticsearch在建立文檔索引時,會將文檔中的原始數據備份,保存到一個叫作_source的屬性中。並且咱們能夠經過過濾_source來選擇哪些要顯示,哪些不顯示。

而若是設置store爲true,就會在_source之外額外存儲一份數據,多餘,所以通常咱們都會將store設置爲false,事實上,store的默認值就是false。

7.四、boost

激勵因子,這個與lucene中同樣

其它的再也不一一講解,用的很少,你們參考官方文檔:

最後

下篇帶你們詳細瞭解 elasticsearch 中的

  • 增:隨機id、自定義id
  • 刪:帶條件刪除
  • 改:帶條件修改
  • 查:帶條件查詢

若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyoo

相關文章
相關標籤/搜索