Elasticsearch 系列(三)- ES的基本操作

来源:https://www.cnblogs.com/xyh9039/p/17845050.html
-Advertisement-
Play Games

本章將和大家分享 Elasticsearch 的一些基本操作。話不多說,下麵我們直接進入主題。 一、索引庫操作 1、settings屬性 settings屬性可以設置索引庫的一些配置信息,例如:配置分片數和副本數、配置自定義分詞器等。 其中分片數量只能在一開始創建索引庫的時候指定,後期不能修改。副本 ...


本章將和大家分享 Elasticsearch 的一些基本操作。話不多說,下麵我們直接進入主題。

一、索引庫操作

1、settings屬性

settings屬性可以設置索引庫的一些配置信息,例如:配置分片數和副本數、配置自定義分詞器等。

其中分片數量只能在一開始創建索引庫的時候指定,後期不能修改。副本數量可以隨時修改。

2、mapping屬性

mapping屬性是對索引庫中文檔的約束,常見的mapping屬性包括:

1)type:欄位數據類型,常見的數據類型在上一章已經介紹過了,此處就不再做過多的描述了。

2)index:是否需要創建倒排索引,預設值為true,如果設置為false那麼表明該欄位不能被檢索,不構建倒排索引。因此,需要根據具體的業務判斷該欄位將來是否需要參與檢索,如果需要的話就設置為true,否則就設置為false。

3)analyzer:使用哪種分詞器,一般結合text(可分詞的文本)數據類型一起使用。

4)properties:該欄位的子欄位。 

3、創建索引庫

ES中通過Restful請求操作索引庫、文檔。請求內容用DSL語句來表示。創建索引庫和mapping的DSL語法如下:

PUT /索引庫名稱
{
  "mappings": {
    "properties": {
      "欄位名":{
        "type""text", //分詞
        "analyzer""ik_smart" //指定分詞器
      },
      "欄位名2":{
        "type""keyword", //不分詞
        "index""false" //不創建倒排索引,不參與搜索
      },
      "欄位名3":{
        "type""object", //對象類型
        "properties": {
          "子欄位": {
            "type""keyword"
          }
        }
      },
      // ...略
    }
  }
}

示例:

# 創建索引庫
PUT /my_index
{
  "mappings": { 
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object", 
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

運行結果如下所示:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_index"
}

4、查看索引庫

查看索引庫語法:

GET /索引庫名

示例:

# 查看索引庫
GET /my_index

運行結果如下所示:

{
  "my_index" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "email" : {
          "type" : "keyword",
          "index" : false
        },
        "info" : {
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "name" : {
          "properties" : {
            "firstName" : {
              "type" : "keyword"
            },
            "lastName" : {
              "type" : "keyword"
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "my_index",
        "creation_date" : "1701011238882",
        "number_of_replicas" : "1",
        "uuid" : "qb-XkR5xQ2y7WvohoWVw_Q",
        "version" : {
          "created" : "7120199"
        }
      }
    }
  }
}

5、修改索引庫

索引庫和mapping一旦創建無法修改,但是可以添加新的欄位,語法如下:

PUT /索引庫名/_mapping
{
  "properties": {
    "新欄位名":{
      "type": "integer"
    }
  }
}

示例:

# 修改索引庫,添加新的欄位
PUT /my_index/_mapping
{
  "properties": {
    "age": {
      "type": "integer"
    }
  }
}

運行結果如下所示:

6、刪除索引庫

刪除索引庫的語法:

DELETE /索引庫名

示例:

# 刪除索引庫
DELETE /my_index

運行結果如下所示:

二、文檔操作

1、新增文檔

新增文檔的DSL語法如下:

POST /索引庫名/_doc/文檔id
{
    "欄位1""值1",
    "欄位2""值2",
    "欄位3": {
        "子屬性1""值3",
        "子屬性2""值4"
    },
    // ...
}

示例:

# 新增文檔
POST /my_index/_doc/1
{
  "info": "黑馬程式員菜鳥學員",
  "email": "[email protected]",
  "name": {
    "firstName": "",
    "lastName": ""
  }
}

運行結果如下所示:

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

2、查詢文檔

查詢文檔的DSL語法如下:

GET /索引庫名/_doc/文檔id

示例:

# 查詢文檔
GET /my_index/_doc/1

運行結果如下所示:

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "info" : "黑馬程式員菜鳥學員",
    "email" : "[email protected]",
    "name" : {
      "firstName" : "",
      "lastName" : ""
    }
  }
}

3、修改文檔

方式一:全量修改文檔,會刪除舊文檔,添加新文檔。該方式既可以修改文檔,也可以新增文檔。對應的DSL語法如下:

PUT /索引庫名/_doc/文檔id
{
    "欄位1""值1",
    "欄位2""值2",
    // ... 略
}

示例:

# 全量修改文檔
PUT /my_index/_doc/1
{
  "info": "黑馬程式員菜鳥學員,奧利給",
  "email": "[email protected]",
  "name": {
    "firstName": "",
    "lastName": ""
  }
}

運行結果如下所示:

方式二:局部修改(增量修改)文檔欄位,修改指定欄位值。對應的DSL語法如下: 

POST /索引庫名/_update/文檔id
{
    "doc": {
         "欄位名""新的值",
    }
}

示例:

# 局部修改文檔欄位
POST /my_index/_update/1
{
  "doc": {
    "email": "[email protected]"
  }
}

運行結果如下所示:

4、刪除文檔

刪除文檔的DSL語法如下:

DELETE /索引庫名/_doc/文檔id

示例:

# 刪除文檔
DELETE /my_index/_doc/1

運行結果如下所示:

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

三、Query DSL 查詢語法

1、數據準備

案例:根據提供的酒店數據創建索引庫,索引庫名稱為hotel,mapping屬性根據資料庫表結構來定義。

其中 MySQL 資料庫中 tb_hotel 酒店表的表結構如下所示:

CREATE TABLE `tb_hotel` (
  `id` bigint(20NOT NULL COMMENT '酒店id',
  `name` varchar(255NOT NULL COMMENT '酒店名稱;例:7天酒店',
  `address` varchar(255NOT NULL COMMENT '酒店地址;例:航頭路',
  `price` int(10NOT NULL COMMENT '酒店價格;例:329',
  `score` int(2NOT NULL COMMENT '酒店評分;例:45,就是4.5分',
  `brand` varchar(32NOT NULL COMMENT '酒店品牌;例:如家',
  `city` varchar(32NOT NULL COMMENT '所在城市;例:上海',
  `star_name` varchar(16DEFAULT NULL COMMENT '酒店星級,從低到高分別是:1星到5星,1鑽到5鑽',
  `business` varchar(255DEFAULT NULL COMMENT '商圈;例:虹橋',
  `latitude` varchar(32NOT NULL COMMENT '緯度;例:31.2497',
  `longitude` varchar(32NOT NULL COMMENT '經度;例:120.3925',
  `pic` varchar(255DEFAULT NULL COMMENT '酒店圖片;例:/img/1.jpg',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

首先分析其數據結構,在創建相應索引庫做 mapping 映射時要考慮的問題,如下:

1)欄位名、數據類型、是否參與搜索、是否分詞、如果分詞,分詞器是什麼?

2)ES中支持兩種地理坐標數據類型,具體要使用哪一種?

  • geo_point:由緯度(latitude)和經度(longitude)確定的一個點。例如:"32.8752345, 120.2981576"
  • geo_shape:有多個geo_point組成的複雜幾何圖形。例如一條直線,"LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"

很明顯我們的酒店在地球上就是一個小點,因此要使用 geo_point 類型。

3)欄位拷貝,可以使用 copy_to 屬性將當前欄位拷貝到指定欄位。

示例: 

"all": {
  "type""text",
  "analyzer""ik_max_word"
},
"brand": {
  "type""keyword",
  "copy_to""all"
}

分析完成後,接著我們就可以去創建相應的索引庫了,如下所示:

# 創建酒店數據索引庫
PUT /hotel
{
  "settings": {
    "analysis": {
      "analyzer": {
        "text_anlyzer": {
          "tokenizer": "ik_max_word",
          "filter": "py"
        },
        "completion_analyzer": {
          "tokenizer": "keyword",
          "filter": "py"
        }
      },
      "filter": {
        "py": {
          "type": "pinyin",
          "keep_full_pinyin": false,
          "keep_joined_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "remove_duplicated_term": true,
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "text_anlyzer",
        "search_analyzer": "ik_smart",
        "copy_to": "all"
      },
      "address": {
        "type": "keyword",
        "index": false
      },
      "price": {
        "type": "integer"
      },
      "score": {
        "type": "integer"
      },
      "brand": {
        "type": "keyword",
        "copy_to": "all"
      },
      "city": {
        "type": "keyword"
      },
      "starName": {
        "type": "keyword"
      },
      "business": {
        "type": "keyword",
        "copy_to": "all"
      },
      
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AvaloniaUI是一個強大的跨平臺.NET客戶端開發框架,讓開發者能夠針對Windows、Linux、macOS、Android和iOS等多個平臺構建應用程式。在構建複雜的應用程式時,模塊化和組件間的通信變得尤為重要。Prism框架提供了模塊化的開發方式,支持插件的熱拔插,而MediatR則是一... ...
  • 概述:JSON Web Token(JWT)是一種用於安全傳輸信息的標準。主要用於身份驗證和信息傳遞,通過頭部、載荷和簽名構成。在.NET Core中,可通過Microsoft.AspNetCore.Authentication.JwtBearer實現後臺服務,提供生成、刷新和驗證Token的介面。 ...
  • NuGet下載Flurl FlurlHttpClient類 public class FlurlHttpClient { private readonly FlurlClient client; public FlurlHttpClient(FlurlClient client) { this.cl ...
  • 上一篇中,老周簡單膚淺地介紹了 XInput API 的使用,並模擬了滑鼠移動,左、右鍵單擊和滾輪。本篇,咱們用 .NET 代碼來完成相同的效果。 說起來也是倒霉,博文寫了一半,電腦忽然斷電了。不知道什麼原因,可能是 UPS 電源出故障。重新開機進來一看,博文沒有自動保存到草稿箱。我記得以前是有自動 ...
  • 通過本篇教程,我們學習瞭如何在 Taurus.MVC WebMVC 中使用部分視圖和頁面片段來提高代碼的復用性和可維護性。我們瞭解了部分視圖和頁面片段的基本概念,並學習瞭如何創建和使用它們。 ...
  • 已知在OpenXml有以下幾種超鏈接 功能 說明 跳轉頁面 跳轉某一頁:ppaction://hlinksldjump跳轉第一頁:ppaction://hlinkshowjump?jump=firstslide跳轉最後一頁:ppaction://hlinkshowjump?jump=lastslid ...
  • 目錄 一、簡介 二、創建gRPC服務端 1.創建gRPC項目 2.編寫自己的服務 三、創建gRPC客戶端 1.創建客戶端項目 2.grPC服務https的調用 3.gRPC內網http調用 4.IOC註入的方式調用gRPC 四、webapi中加入gRPC 回到頂部 一、簡介 簡單解析一下gRPC,g ...
  • 通過本篇教程,我們學習瞭如何在 Taurus.MVC WebMVC 中配置路由並將其映射到控制器和操作方法。我們學習了預設路由和自定義路由的創建方法,並瞭解了不同 URL 對控制器和操作方法的影響。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...