亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ElasticSearch的作用是什么

發布時間:2021-08-06 14:52:21 來源:億速云 閱讀:1072 作者:Leah 欄目:編程語言

ElasticSearch的作用是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。


(一)介紹

ElasticSearch的目標就是實現搜索。在數據量少的時候,我們可以通過索引去搜索關系型數據庫中的數據,但是如果數據量很大,搜索的效率就會很低,這個時候我們就需要一種分布式的搜索引擎。Elasticsearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口

ES主要用于全文檢索、結構化搜索以及分析。ES的應用十分廣泛,比如維基百科、Github等都使用ES實現搜索。

(二)核心概念理解

2.1 數據結構

ES既然是用來搜索的,那么它必然也需要存儲數據。在Mysql等關系型數據庫中,數據的存儲遵循下面的邏輯:

一個數據庫(database)中有多個表(tables),每個表有多行數據(rows),每一行數據由多個字段(columns)組成。

ES中的存儲是這樣的:

一個索引(indeces)相當于一個數據庫(database),每個索引中有多個類型types(相當于表結構),每個索引中有多個documents(相當于行),每個documents由多個fields組成(相當于字段)。

你可以把ES理解為他是一個面向文檔的數據庫。下面用一張圖描述ES和關系型數據庫之間的相似之處:

ElasticSearch的作用是什么 值得注意的是,在ES7.x版本中,types將慢慢被遺棄,在8.x版本中,types將會徹底棄用。

2.2 索引(indeces)和文檔(documents)

ES中的索引和Mysql中的索引不是同一種東西,ES中的索引是一個文檔的集合,索引就是一個數據庫。

前面說了ES是面向文檔的,文檔是ES中最重要的單位,文檔就是一條條的數據。文檔中有幾個重要的概念:

1、一篇文檔中包含多個key:value

2、文檔其實就是一個JSON字符串

2.3 分片

我們通過EShead創建一個索引時,他會讓我們選擇分片數量和副本數量

ElasticSearch的作用是什么

ES是一個分布式搜索引擎,分片就是把一堆數據分布到多個分片中。而索引是對每個分片的一個備份,這些副本同樣能處理查詢請求。

現在假設集群有兩個node節點,設置分片數是5個,副本數是1個,那么數據存儲結構將變成下面這樣,可以保證副本和分片在不同的節點上:

ElasticSearch的作用是什么

2.4 倒排索引

為什么ES的搜索這么快,和其中所使用的倒排索引也有一定的關系。倒排索引建立的是分詞和文檔之間的映射關系。下面通過一個簡單的例子來講解一下什么是倒排索引

ElasticSearch的作用是什么

原來的數據中我們通過文檔ID去關聯標簽,但是在查詢時就需要遍歷所有文檔。通過倒排索引,我們可以通過關鍵詞來找到最匹配的文檔。

(三)ES的基本操作

ES是基于Restful風格進行操作的,因此對于習慣了寫crud的程序員來說,ES很容易上手。ES的操作可以使用Kibana,也可以使用Postman直接調用,因為歸根結底它就是一個restful的操作。我這里使用Idea的ES插件直接調用。 3.1 創建文檔

PUT http://ip:port/索引名/類型名/文檔id

{
    "key":"value"
}

因為類型名在后續的版本中將會被刪除,這里可以用_doc代表默認類型:

PUT http://ip:port/索引名/_doc/文檔id

下面給出操作截圖

ElasticSearch的作用是什么

通過put創建一個索引之后,我們可以在head中看到對應的數據

ElasticSearch的作用是什么

3.2 創建帶有數據類型的索引

3.1中創建數據時,沒有指定具體的數據類型,我們當然也可以為索引指定數據類型

PUT http://ip:port/索引名
參數示例:
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "address": {
        "type": "text"
      }
    }
  }
}

ES中的核心數據類型如下:

(1)字符串類型: text, keyword
(2)數字類型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 納秒:date_nanos
(5)布爾型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range

3.3 查看索引或者文檔的數據

通過GET請求可以查看索引以及文檔的信息:

GET http://ip:port/索引名   #查看索引
GET http://ip:port/索引名/類型名/文檔ID  #查看文檔

3.4 修改數據

修改數據和創建數據一樣,通過PUT操作就會更新原來的數據:

PUT http://ip:port/索引名/類型名/文檔id
{
    "key":"value"
}

如果是修改的話,響應結果中的version就會增加。

另外一種方法是使用Post請求:

POST http://ip:port/索引名/類型名/文檔id/_update
參數實例:
{
  "doc": {
    "name": "javayz4"
  }
}

更推薦使用這種方式,如果使用PUT方法忘了加某個key,更新就會變成新增

3.5 刪除數據

通過DELETE的方式刪除數據

DELETE http://ip:port/索引名/類型名/文檔id  #刪除具體的文檔
DELETE http://ip:port/索引名  #刪除索引

(四)ES的搜索操作

ES最重要的就是它的搜索操作了。

4.1 簡單搜索

直接將搜索的參數帶到鏈接中:

GET http://ip:port/索引名/_search?q=key:value

結果如下:

ElasticSearch的作用是什么

4.2 通過param傳遞參數

除了將參數放到鏈接當中,還可以將參數通過JSON請求體的方式傳遞,其中from和size是分頁的參數query中傳遞查詢條件_source表示結果中要展示的列,不寫就表示展示所有。

GET http://ip:port/索引名/_search
參數示例:
{
  "from": 0,
  "size": 20,
  "query": {
    "match": {
      "name": "javayz2"
    }
  },
  "_source": ["name","address"]
}

除了上面示例中的這些參數之外,還有很多參數可以使用,比如排序

"sort": [
  {
    "age": {
      "order": "desc"
    }
  }
]

多條件查詢:must表示下面的兩個條件都要滿足,還可以填should,表示任意滿足其中一個條件即可,或者是must_not,表示must的相反值

"query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "javayz"
          }
        },
        {
          "match": {
            "address": "hz"
          }
        }
      ]
    }
}

如果你的數據中存在集合,可以通過空格對多個條件進行查詢:

ElasticSearch的作用是什么 查詢過程中還支持高亮查詢

"highlight":{
  "pre_tags": "<em>",
  "post_tags": "</em>",
  "fields": {
    "name": {}
  }
}

ElasticSearch的作用是什么

(五)分詞器

所謂分詞器,就是將一段話分成一個個關鍵字,搜索時就按照這些關鍵字進行搜索。比較好用的分詞器有中文的IK分詞器。

5.1 基本使用

給出下載鏈接:https://github.com/medcl/elasticsearch-analysis-ik/releases

下載和自己ES相同的版本,在plugin目錄下新建一個ik文件夾,將下載的文件解壓到ik目錄下,重新啟動即可。

IK分詞器提供了兩種算法:

1、ik_smart:最少切分

2、ik_max_word:最細粒劃分

首先最少切分是根據字典給出最少的切分:

ElasticSearch的作用是什么 ik_max_word是最細粒劃分,他會給出最多的結果:

{
  "analyzer": "ik_max_word",
  "text": "我是Java工程師"
}

結果:

{
  "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": "java",
      "start_offset": 2,
      "end_offset": 6,
      "type": "ENGLISH",
      "position": 2
    },
    {
      "token": "工程師",
      "start_offset": 6,
      "end_offset": 9,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "工程",
      "start_offset": 6,
      "end_offset": 8,
      "type": "CN_WORD",
      "position": 4
    },
    {
      "token": "師",
      "start_offset": 8,
      "end_offset": 9,
      "type": "CN_CHAR",
      "position": 5
    }
  ]
}

5.2 字典

對于一些名詞,IK自帶的字典無法區分,比如我的博客名Java魚仔,它分詞后是這樣的:

ElasticSearch的作用是什么

因此我們需要手動去增加這樣的字典,IK目錄下的config/IKAnalyzer.cfg.xml中可以添加自己的字典,首先我在config下新建一個my.dic文件,里面的詞匯現在只寫了一個Java魚仔。然后在配置文件中配置自己的my.dic

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 擴展配置</comment>
        <!--用戶可以在這里配置自己的擴展字典 -->
        <entry key="ext_dict">my.dic</entry>
         <!--用戶可以在這里配置自己的擴展停止詞字典-->
        <entry key="ext_stopwords"></entry>
        <!--用戶可以在這里配置遠程擴展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用戶可以在這里配置遠程擴展停止詞字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重啟后再次進行分詞,結果如下:

ElasticSearch的作用是什么

關于ElasticSearch的作用是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈尔滨市| 蒙山县| 丹凤县| 平塘县| 沽源县| 道真| 隆子县| 永登县| 宣城市| 新巴尔虎左旗| 桃源县| 固镇县| 佳木斯市| 綦江县| 遂川县| 黄大仙区| 保亭| 宜阳县| 贵港市| 永昌县| 晋城| 和田县| 伽师县| 惠来县| 神农架林区| 海南省| 南陵县| 会东县| 邳州市| 山西省| 巧家县| 武夷山市| 耒阳市| 新绛县| 和静县| 靖宇县| 东兰县| 定州市| 鄂州市| 习水县| 安多县|