了解一下Elasticsearch的基本概念


一、前文介紹

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

Lucene 非常復雜,你需要深入的了解檢索相關知識來理解它是如何工作的,就跟學習 springmvc 之前先從 servlet 開始,繁瑣復雜的工作,Solor、Elasticsearch 應由而生, 其使用 Java 編寫並使用 Lucene 來建立索引並實現搜索功能,但是它的目的是通過簡單連貫的 RESTful API 讓全文搜索變得簡單並隱藏 Lucene 的復雜性。

重要特性:

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

基本概念:

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

詳細說明:

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

要注意的是:Elasticsearch 本身就是分布式的,因此即便你只有一個節點,Elasticsearch 默認也會對你的數據進行分片和副本操作,當你向集群添加新數據時,數據也會在新加入的節點中進行平衡。

二、Elasticsearch安裝[windows]

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

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

解壓后,進入 bin/ 目錄,雙擊執行 elasticsearch .bat

Elasticsearch 啟動后可以看到綁定了兩個端口:

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

9200,我們可以通過瀏覽器直接訪問,9300 則不可以直接訪問。

三、Kibana 安裝

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

而且還提供了操作 Elasticsearch 索引數據的控制台,並且提供了一定的API提示,非常有利於我們學習 Elasticsearch 的語法。

1、配置

我們可以把 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":     "我喜歡編程"
}

四、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

五、基本概念-詳細了解

上文也了解到 ES 操作的數據為 json,實際項目中,比如 springboot 中,無須操作 json,都是面向對象編程,但是,學習其實際原理固然重要。

5.1、創建索引

創建索引的請求格式:

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

示例:

5.2、查看索引設置

語法

Get請求可以幫我們查看索引信息,格式:

GET /索引庫名
5.3、刪除索引

刪除索引使用DELETE請求

語法

DELETE /索引庫名

六、映射配置

6.1、創建映射字段

語法

請求方式依然是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.2、查看映射關系

語法:

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.1、type

Elasticsearch 中支持的數據類型非常豐富:

我們說幾個關鍵的:

String類型,又分兩種:

  • text:可分詞,不可參與聚合
  • keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合

Numerical:數值類型,分兩類:

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

Date:日期類型

elasticsearch 可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為 long,節省空間。

7.2、index

index影響字段的索引情況。

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

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

但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。

7.3、store

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

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

但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。

原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source的屬性中。而且我們可以通過過濾_source來選擇哪些要顯示,哪些不顯示。

而如果設置store為true,就會在_source以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。

7.4、boost

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

其它的不再一一講解,用的不多,大家參考官方文檔:

最后

下篇帶大家詳細了解 elasticsearch 中的

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

推薦閱讀:

重溫Elasticsearch:https://www.cnblogs.com/niceyoo/p/11329426.html

elasticsearch集群搭建-windows:https://www.cnblogs.com/niceyoo/p/11343697.html

基於Docker方式實現Elasticsearch集群:https://www.cnblogs.com/niceyoo/p/11342903.html

18年專科畢業后一度迷茫,創建了一個用來記錄自己成長的公眾號,感興趣的小伙伴可以關注一下~


免責聲明!

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



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