56.windows docker 安裝ES、Go操作ES

文章目錄

  • 一、環境準備
    • 1、 docker安裝ES
    • 2、啟動容器
    • 3、圖像化客戶端工具ElasticSearch-Head
  • 二、Go ES連接與認證
    • 1、 連接ES
    • 2、配置ES認證
  • 三、索引的增刪改查
  • 四、文檔的增刪改
    • 創建單個文檔
    • 根據文檔id刪除文檔
    • 批量刪除文檔
    • 批量創建文檔
  • 五、文檔查詢
    • 列表查詢
    • 精確匹配
    • 模糊匹配
    • 嵌套字段的搜索
  • 六、 更新文檔

代碼地址: https://gitee.com/lymgoforIT/golang-trick/tree/master/34-go-es

一、環境準備

1、 docker安裝ES

首先需要先安裝docker,這個網上教程很多,這里就默認docker已經安裝好了。當然如果不想用docker的話,也可以和redis、kafka等組件一樣,下載后加壓、配置環境變量便可以開始使用了。

拉取elasticsearch的鏡像

docker pull elasticsearch:7.12.0

在這里插入圖片描述

創建docker容器掛載的目錄

之所以在容器啟動的時候要配置掛載的宿主機目錄,是因為想要在宿主機(本機)上記錄下來當前ES容器的配置信息,數據以及插件等,這樣即使到時候我們把容器刪了,重新用鏡像生成容器時,只要掛載的還是這三個目錄,那么即使鏡像變了,端口變了,但是啟動的容器和之前的會是一樣的。

PS:掛載指是是宿主機(本機)的目錄映射到容器中的某個目錄,一方改動,另一方會相應的改動,通過容器啟動時 -v 選項配置。

主要是三個目錄:config 、data 、plugins,其實我們如果是自己安裝ES,而不是通過docker安裝的話,也是可以看到這三個目錄的。

在這里插入圖片描述
既然我們本次是用docker演示的,那就手動創建一下這三個目錄吧,如下,放到了自己建的docker-es目錄下
在這里插入圖片描述
然后在config目錄下建立配置文件elasticsearch.yml并寫入內容 http.host: 0.0.0.0,表示監聽本機上的所有IP地址, 也就是接收本機所有網卡發到本進程端口的請求
在這里插入圖片描述

如果是linux的話,通過命令就可以完成上述步驟了,當然目錄名字就稍微換了,畢竟linux沒有盤符的概念

# linux的命令
mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/pluginschmod 777 /opt/es/dataecho "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml

2、啟動容器

linux


docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/es/data:/usr/share/elasticsearch/data -v /opt/es/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

windows


docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v D:\\GoDevKit\\ElasticSearch\\docker-es\\config\\elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v D:\\GoDevKit\\ElasticSearch\\docker-es\\data:/usr/share/elasticsearch/data -v D:\\GoDevKit\\ElasticSearch\\docker-es\\plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

解釋:

  • docker run :運行容器的命令
  • --name:啟動后容器的名字
  • -p:端口映射,表示訪問宿主機的9200端口,會映射訪問到容器的9200端口,9200是外部訪問esrestful端口,9300es集群內部節點之間通信的端口。
  • -e ES_JAVA_OPTS="-Xms84m -Xmx512m": esJava寫的,這里是設置Java虛擬機相關參數
  • -v:目錄掛載映射,這里也可以看到es容器是自帶了那三個目錄的,就像我們自己安裝es一樣,只是現在我們想將宿主機的三個目錄與之映射,這樣即使刪除了容器,之前新建的容器只要還是掛載的宿主機這三個目錄,那就還是會和原來的容器一樣的。
  • -d:后臺運行
  • 最后的參數時鏡像名字

啟動成功:
在這里插入圖片描述

通過docker desktop可以看到容器正在運行中了

在這里插入圖片描述

訪問本機的9200端口

在這里插入圖片描述

并且可以看到我們創建的data空目錄中也就有一些數據了

在這里插入圖片描述

3、圖像化客戶端工具ElasticSearch-Head

ElasticSearch-Head的安裝和使用可以參考:https://www.cnblogs.com/xuwenjin/p/8792919.html

1、elasticsearch-head是一個基于node.js的前端工程,所以需要先安裝node.js,下載地址:https://nodejs.org/en/download,下載完成后,基本就是無腦式下一步即可,安裝完成后使用node -v查看版本判斷是否安裝成功。
在這里插入圖片描述
2、安裝grunt為全局命令,grunt是基于node.js的項目構建工具

npm install -g grunt-cli

grunt需要的一些jar包也安裝上,需要聯網下載,可能需要一點時間

npm instll

3、下載elasticsearch-head配置包,下載地址:https://github.com/mobz/elasticsearch-head

下載后,進入到該目錄中,打開cmd,輸入npm run start

在這里插入圖片描述

打開瀏覽器連接,綠色表示連接成功了,事實上第一次操作是連接不上的,因為9100去連接9200端口,屬于跨域了,是會被拒絕了,所以需要在elasticsearch.yml配置文件中加上允許跨域連接的配置

http.cors.enabled: true
http.cors.allow-origin: "*"

在這里插入圖片描述

然后通過docker desktop 重啟重啟容器,就可以看到連接成功啦

在這里插入圖片描述

在這里插入圖片描述

二、Go ES連接與認證

安裝依賴包

go get github.com/olivere/elastic/v7

1、 連接ES

對于連接操作,我們一般都是會定義一個包級別的變量,然后提供一個顯示的Init方法,然后在main方法中初始化,如下

es_connect.go

package coreimport ("fmt""github.com/olivere/elastic/v7"
)var EsClient *elastic.Clientfunc InitEsConn() {client, err := elastic.NewClient(elastic.SetURL("http://127.0.0.1:9200"), // ES服務器地址// 我們的ES是通過docker啟動的,所以會有docker為其分配的IP地址,但是我們想用本機的,然后通過端口映射訪問到docker中的,所以這里設置false,表示跳過IP檢查elastic.SetSniff(false),elastic.SetBasicAuth("", ""),)if err != nil {panic(any(err))}EsClient = clientfmt.Println(EsClient)
}

main.go

package mainimport "golang-trick/34-go-es/core"func main() {core.InitEsConn()
}

運行后,可以看到連接成功

在這里插入圖片描述

2、配置ES認證

不需要認證的情況

  • 服務器自己使用,92009300端口不對外開放
  • 本身跑在127.0.0.1

需要認證的情況:

  • ES需要對外提供服務的,我們總不能讓外部也能隨意通過ip:端口的方式隨意的訪問到我們的ES數據,所以需要配置認證

配置認證的方式參考:https://blog.csdn.net/qq_38669698/article/details/130529829

  1. 啟用認證,由于我們配置了目錄映射,所以改宿主機的elasticsearch.yml文件即可,添加如下內容
#添加如下內容
#http.cors.allow-headers: Authorization #這個配置改為下面的
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

在這里插入圖片描述

2.保存后,重啟ES

docker restart es

在這里插入圖片描述

  1. 設置用戶密碼

a. 上一步重啟ES容器后,進入容器:

docker exec -it es /bin/bash

b. 進入容器后,執行以下命令

./bin/elasticsearch-setup-passwords interactive
出現:Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]

上邊英文大概的意思是:你如果確定開啟密碼的話,需要設置以下六種賬戶的密碼(建議設置成一樣的)

Please confirm that you would like to continue [y/N]yEnter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana]: 
Reenter password for [kibana]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]:Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

在這里插入圖片描述

c.完成以上的設置后,需要再次重啟ES容器
在這里插入圖片描述

d. 驗證

http://127.0.0.1:9200/

可以看到再次訪問,就需要我們輸入用戶名和密碼了,用戶名是固定的elastic,密碼則是我們自己設置的

在這里插入圖片描述

現在執行我們開始的連接代碼,也會報錯了,因為沒有給用戶名和密碼

在這里插入圖片描述

此外,使用ES-Head連接時,也需要改為http://localhost:9100/?auth_user=elastic&auth_password=123456,即需要帶上用戶名和密碼了

在這里插入圖片描述

三、索引的增刪改查

在這里插入圖片描述

首先我們創建一個結構體User,用于后續封裝從ES中查詢的出來的數據,并設置一個mapping(定義索引下的字段約束,其中properties表示的就是索引下文檔的各字段)

user.go類似MySQL中的Model,定義結構體,表名等。這里就是ES的Model,定義索引名和mapping等。

package modelimport "time"type User struct {Id       uint   `json:"id"`UserName string `json:"user_name"`NickName string `json:"nick_name"`//Age       int    `json:"age"`CreateAt string `json:"create_at"`Title    string    `json:"title"`
}func (u *User) Index() string{return "user_index"
}func (u *User) Mapping() string {return `
{"mappings": {"properties": {"nick_name": { "type": "text"},"user_name": { "type": "keyword" // 完整匹配},"age": { "type": "integer" // 完整匹配},"id": {"type": "integer"},"created_at":{"type": "date","null_value": "null","format": "[yyyy-MM-dd HH:mm:ss]"}}}
}
`
}

index.go :索引的創建、刪除、判斷索引是否已經存在

package indexsimport ("context""fmt""golang-trick/34-go-es/core""golang-trick/34-go-es/model"
)func CreateIndex(indexName string) error {// 索引不存在時,我們才創建,否則請求創建已經存在的索引會報錯的if ExistsIndex(indexName) {// 刪除已經存在的索引,然后新建索引err := DeleteIndex(indexName)if err != nil {return err}}index, err := core.EsClient.CreateIndex(indexName).                // 創建索引BodyString((&model.User{}).Mapping()). // 指定索引的mapping,類似mysql中的表各字段的一個類型和其他約束Do(context.Background())               // 執行if err != nil {fmt.Println(err)return err}fmt.Println(fmt.Printf("創建了索引,索引:%v", index))return nil
}func ExistsIndex(indexName string) bool {exists, _ := core.EsClient.IndexExists(indexName).Do(context.Background())return exists
}func DeleteIndex(indexName string) error {_, err := core.EsClient.DeleteIndex(indexName).Do(context.Background())fmt.Println("刪除了索引")return err}

運行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/indexs"
)func main() {core.InitEsConn()indexs.CreateIndex("user_index")
}

ES-Head中可以看到索引和相關字段了
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

再次執行的話,會按我們的代碼定義的方式,先刪除原有的索引,然后創建新的索引

在這里插入圖片描述

四、文檔的增刪改

創建單個文檔

package docsimport ("context""fmt""golang-trick/34-go-es/core""golang-trick/34-go-es/model""time"
)func CreateDoc() {user := &model.User{Id:       10,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:03:04"), // 需要按照mapping中的約束格式傳,否則報錯Title:    "學習創建索引",}indexResp, err := core.EsClient.Index().                 // 表明是要對索引進行操作Index(user.Index()).     // 指定要操作的索引BodyJson(user).          // 文檔的內容,會將結構體給我們轉為JSON字符串Do(context.Background()) // 執行if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", indexResp)
}

運行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")docs.CreateDoc()
}

在這里插入圖片描述
在這里插入圖片描述

要注意的是,這樣查看顯示的數據是不全的,比如上面就沒有顯示titlecreate_at字段,可以點擊文檔,查看JSON樣式的完整數據

在這里插入圖片描述

如果是mapping里面沒有的字段,文檔也是可以創建成功的,并且會加上該字段,如上面的title字段在mapping中就是沒有的,但是也保存到文檔中成功了。

根據文檔id刪除文檔

// 注意:這里的id是文檔id,不是文檔內容中的id字段
func DeleteDoc(id string) {deleteResp, err := core.EsClient.Delete().                       // 獲取一個DeleteService對象Index((&model.User{}).Index()). // 指明索引Id(id).Refresh("true"). // 刪除后,索引會過一會才刷新,這里傳true,索引會立即刷新,刪除操作我們一般都傳trueDo(context.Background())if err != nil { // 如果文檔不存在,會報404錯誤fmt.Println(err)return}fmt.Printf("%#v\n", deleteResp)}

執行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")
}

在這里插入圖片描述
在這里插入圖片描述

批量刪除文檔

批量刪除需要用到Bulk對象,將要操作的文檔放入Bulk中,然后一次性提交給ES服務器執行

在這里插入圖片描述

執行前我們又插入了兩條數據,用于測試
在這里插入圖片描述

根據文檔ID列表批量刪除文檔代碼


// 注意:這里的id是文檔id,不是文檔內容中的id字段
// 傳入文檔id列表
func BatchDeleteDoc(ids []string) {bulkService := core.EsClient.Bulk(). // 獲取BulkService對象Index((&model.User{}).Index()). // 指明要操作的索引Refresh("true")for _, id := range ids {bulk := elastic.NewBulkDeleteRequest().Id(id)bulkService.Add(bulk)}bulkResp, err := bulkService.Do(context.Background())if err != nil {fmt.Println(err)return}// 如果文檔不存在,不會有錯誤,bulkResp.Succeeded()為空,否則就是刪除成功的數量fmt.Printf("%#v\n", bulkResp.Succeeded()) }

執行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})
}

批量刪除成功

在這里插入圖片描述

批量創建文檔

與批量刪除類似,只是添加到BulkService對象中的對象變為了BulkCreateRequest

func BatchCreateDoc() {userList := []model.User{{Id:       11,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:04:05"),},{Id:       12,UserName: "lym",NickName: "夜空中最亮的星",CreateAt: time.Now().Format("2006-01-02 15:04:05"),},}bulkService := core.EsClient.Bulk(). // 獲取BulkService對象Index((&model.User{}).Index()). // 指明要操作的索引Refresh("true")for _, user := range userList {// 與批量刪除主要就是這一行不同bulk := elastic.NewBulkCreateRequest().Doc(user)bulkService.Add(bulk)}bulkResp, err := bulkService.Do(context.Background())if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", bulkResp)}

執行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})docs.BatchCreateDoc()
}

在這里插入圖片描述

五、文檔查詢

列表查詢

返回結構如下,主要是res.Hits.Hits中的一條記錄,是SearchHit對象,里面的Source為我們的文檔數據,json.RawMessage就是[]byte的別名而已,所以可以直接轉為string,或者反序列化到我們的結構體對象中
在這里插入圖片描述

代碼如下:

func FindDoc() {query := elastic.NewBoolQuery()res, err := core.EsClient.Search((&model.User{}).Index()). // 指定索引,且表明是查詢操作Query(query). // 查詢條件From(0). // 分頁操作Size(10).Do(context.Background())if err != nil {fmt.Println(err)return}count := res.Hits.TotalHits.Valuefmt.Println(count)for _, hit := range res.Hits.Hits {fmt.Println(string(hit.Source))}
}

執行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})// docs.BatchCreateDoc()docs.FindDoc()
}

在這里插入圖片描述

精確匹配

精確匹配只能對mapping中定義為keyword的字段生效,比如下面我們只能對user_name使用精確匹配,對nick_name字段無法使用,所以在設計索引時,如果已知后面會對某個字段進行精確匹配,應該將其設置為keyword類型

在這里插入圖片描述

代碼:

func FindDoc() {limit := 10page := 1from := (page - 1) * limit//query := elastic.NewBoolQuery()query := elastic.NewTermQuery("user_name", "lym")res, err := core.EsClient.Search((&model.User{}).Index()). // 指定索引,且表明是查詢操作Query(query).                    // 查詢條件From(from).                      // 分頁操作Size(limit).Do(context.Background())if err != nil {fmt.Println(err)return}count := res.Hits.TotalHits.Valuefmt.Println(count)for _, hit := range res.Hits.Hits {fmt.Println(string(hit.Source))}
}

執行:
在這里插入圖片描述
如果換成nick_name,即使寫為了完全正確的夜空中最亮的星,也是匹配不到結果的,因為nick_nametypetext,不是keyword
在這里插入圖片描述

模糊匹配

  • 主要是查text,也能查keyword

  • 模糊匹配keyword字段,是需要查完整的

  • 匹配text字段則不用,搜完整的也會搜出很多

代碼:

查詢對象換為NewMatchQuery即可

在這里插入圖片描述

嵌套字段的搜索

我們在創建索引時,并沒有指定title字段的mapping,但是因為在插入文檔時,帶了title字段,es會自動幫我們將其加入到mapping中,且是一個嵌套類型,如下

"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}
}

因為titletext類型,只能模糊匹配,但是需要精確匹配的時候,也能通過title.keyword的形式進行精確匹配,如下

query := elastic.NewTermQuery("title.keyword", "學習創建索引2") // 精確匹配
//query := elastic.NewMatchQuery("title", "學習")  // 模糊匹配

六、 更新文檔

更新文檔,我們一般都是已經知道文檔id了,所以就是根據文檔id進行更新,傳入map即可

更新前

在這里插入圖片描述
代碼:

func UpdateDoc(id string) {res, err := core.EsClient.Update().Index((&model.User{}).Index()).Id(id).Doc(map[string]any{"user_name": "lymUpdate",}).Do(context.Background())if err != nil {fmt.Println(err)return}fmt.Printf("%#v\n", res)
}

執行:

package mainimport ("golang-trick/34-go-es/core""golang-trick/34-go-es/docs"
)func main() {core.InitEsConn()// indexs.CreateIndex("user_index")//docs.CreateDoc()//docs.DeleteDoc("d6ldWYwBwPESsKz-qasv")// docs.BatchDeleteDoc([]string{"eKmUWYwBwPESsKz-8qsp", "eamVWYwBwPESsKz-DKve"})// docs.BatchCreateDoc()// docs.FindDoc()docs.UpdateDoc("eqmeWYwBwPESsKz-nasc")
}

更新后
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu18.04配置cuda+cudnn+tensorrt+anconda+pytorch-gpu+pycharm

一、顯卡驅動安裝 執行nvidia-smi查看安裝情況 二、cuda安裝 cuda官網下載cuda_11.6.2_510.47.03_linux.run,安裝執行 sudo sh cuda_11.6.2_510.47.03_linux.run提升安裝項,驅動不用安裝,即第一項(Driver)&#xff…

如何使用Java在Excel中添加動態數組公式?

本文由葡萄城技術團隊發布。轉載請注明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 前言 動態數組公式是 Excel 引入的一項重要功能,它將 Excel 分為兩種風格:Excel 365 和傳統 …

虹科技術 | IO-Link Wireless如何賦能工廠車間邁向無線自動化?

大規模定制、卓越運營和商業智能正在從根本上改變制造業,為了在競爭中立于不敗之地,制造商需要更加靈活、通用、可擴展和具有成本效益的機器和生產線。隨著制造商向工業 4.0 邁進,更好的適應性、更高的吞吐量和更短的停機時間是他們的共同要求…

打包CSS

接上一個打包HTML繼續進行CSS的打包 1.在之前的文件夾里的src文件夾創建一個css文件 2.在瀏覽器打開webpack——>中文文檔——>指南——>管理資源——>加載CSS 3.復制第一句代碼到終端 4.復制下圖代碼到webpack.config.js腳本的plugins:[.....]內容下…

【docker】Hello World

搜索hello-world鏡像 docker search hello-world拉去鏡像 docker pull hello-world查看本地鏡像 docker images 運行鏡像 docker run hello-world查看所有的容器 docker ps -a查詢start狀態容器 docker ps 輸出介紹 CONTAINER ID: 容器 ID。IMAGE: 使用的鏡像。COMMAN…

面試經典150題(14)

leetcode 150道題 計劃花兩個月時候刷完,今天(第五天)完成了1道(14)150: 14. (134. 加油站)題目描述: 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油…

<JavaEE> 鎖進階 -- synchronized 的鎖優化

目錄 一、如何形容 synchronized 鎖 二、鎖升級 2.1 偏向鎖 2.2 輕量級鎖 2.3 重量級鎖 三、鎖消除 四、鎖粗化 一、如何形容 synchronized 鎖 synchronized 鎖是一個內部優化非常好的鎖,大部分情況下這個鎖都是適用的。在初始階段 synchronized 是一個樂觀…

分布式搜索引擎02

分布式搜索引擎02 在昨天的學習中,我們已經導入了大量數據到elasticsearch中,實現了elasticsearch的數據存儲功能。但elasticsearch最擅長的還是搜索和數據分析。 所以今天,我們研究下elasticsearch的數據搜索功能。我們會分別使用DSL和Res…

react面試總結2

redux中sages和thunk中間件的區別,優缺點 Redux 中的 redux-saga 和 redux-thunk 都是中間件,用于處理異步操作,但它們有一些區別。 Redux Thunk: 簡單易用:redux-thunk 是比較簡單直觀的中間件,它允許 …

手撕分布式緩存---HTTP Server搭建

經過了前兩個章節的學習,分布式緩存的存儲與新增我們已經實現了,并且對其做了高可用處理。本章節我們剝離和緩存強相關的邏輯,開始搭建一個HTTP服務器,畢竟緩存數據庫搭建完之后別人沒法訪問也是沒有用處的。這一章節我們重點學習…

ElasticSearch應用場景以及技術選型[ES系列] - 第496篇

歷史文章(文章累計490) 《國內最全的Spring Boot系列之一》 《國內最全的Spring Boot系列之二》 《國內最全的Spring Boot系列之三》 《國內最全的Spring Boot系列之四》 《國內最全的Spring Boot系列之五》 《國內最全的Spring Boot系列之六》 M…

PDF控件Spire.PDF for .NET【轉換】演示:將 PDF 轉換為 Excel

PDF是一種通用的文件格式,但它很難編輯。如果您想修改和計算PDF數據,將PDF轉換為Excel將是一個理想的解決方案。在本文中,您將了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中將 PDF 轉換為 Excel。 Spire.Doc 是一款專門對 Word 文檔進行…

【華為數據之道學習筆記】3-10元數據管理架構及策略

元數據管理架構包括產生元數據、采集元數據、注冊元數據和運 維元數據。 產生元數據: 制定元數據管理相關流程與規范的落地方案,在IT產品開發過程中實現業務元數據與技術元數據的連接。 采集元數據: 通過統一的元模型從各類IT系統中自動采集元…

多線程(初階九:線程池)

目錄 一、線程池的由來 二、線程池的簡單介紹 1、ThreadPoolExecutor類 (1)核心線程數和最大線程數: (2)保持存活時間和存活時間的單位 (3)放任務的隊列 (4)線程工…

Axure的安裝以及簡單使用

目錄 Axure簡介 是什么 有什么用 Axure的優缺點 優點: 缺點: 安裝 漢化 Axure的使用 工具欄 頁面 ?編輯 添加子頁面 ?編輯 Axure簡介 是什么 Axure是一款著名的原型設計工具。它允許用戶創建交互式線框圖、流程圖、原型和其他設計文檔&…

「Verilog學習筆記」脈沖同步電路

專欄前言 本專欄的內容主要是記錄本人學習Verilog過程中的一些知識點,刷題網站用的是牛客網 timescale 1ns/1nsmodule pulse_detect(input clk_fast , input clk_slow , input rst_n ,input data_in ,output dataout );reg data_level, dat…

第十一章 React 封裝自定義組件

一、專欄介紹 🌍🌍 歡迎加入本專欄!本專欄將引領您快速上手React,讓我們一起放棄放棄的念頭,開始學習之旅吧!我們將從搭建React項目開始,逐步深入講解最核心的hooks,以及React路由、…

【NLP】RAG 應用中的調優策略

? 檢索增強生成應用程序的調優策略 沒有一種放之四海而皆準的算法能夠最好地解決所有問題。 本文通過數據科學家的視角審視檢索增強生成(RAG)管道。它討論了您可以嘗試提高 RAG 管道性能的潛在“超參數”。與深度學習中的實驗類似,例如&am…

關于jinja2高版本api變化導致notebook導出html失敗的問題

最新jinja2版本已經到了3.1.2,但是nbconvert引用的應該是老版本,具體代碼報錯如下 Type "help", "copyright", "credits" or "license" for more information. >>> import nbconvert Traceback (most…

spark從表中采樣(隨機選取)一定數量的行

在Spark SQL中,你可以使用TABLESAMPLE來按行數對表進行采樣。以下是使用TABLESAMPLE的示例: SELECT * FROM table_name TABLESAMPLE (1000 ROWS);在這個示例中,table_name是你要查詢的表名。TABLESAMPLE子句后面的(1000 ROWS)表示采樣的行數…