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
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...