商城-學習整理-高級-全文檢索-ES(九)

目錄

  • 一、ES簡介
    • 1、網址
    • 2、基本概念
      • 1、Index(索引)
      • 2、Type(類型)
      • 3、Document(文檔)
      • 4、倒排索引機制
        • 4.1 正向索引和倒排索引
        • 4.2 正向索引
        • 4.3 倒排索引
    • 3、相關軟件及下載地址
      • 3.1 Kibana簡介
      • 3.2 logstash簡介
  • 二、Docker安裝ES
    • 1、下載鏡像文件
    • 2、創建實例
      • 1、ElasticSearch
      • 2、Kibana
  • 三、初步檢索
    • 1、_cat
    • 2、索引一個文檔(保存)
    • 3、查詢文檔
    • 4、更新文檔
    • 5、刪除文檔&索引
    • 6、bulk 批量 API
    • 7、樣本測試數據
  • 四、進階檢索
    • 1、SearchAPI
      • 1)、檢索信息
    • 2、Query DSL((domain-specific language 領域特定語言)
      • 1)、基本語法格式
      • 2)、返回部分字段
      • 3)、match【匹配查詢】
      • 4)、match_phrase【短語匹配】
      • 5)、multi_match【多字段匹配】
      • 6)、bool【復合查詢】
      • 7)、filter【結果過濾】
      • 8)、term
    • 3、Mapping
      • 1)、字段類型
      • 2)、映射
      • 3)、新版本改變
    • 4、分詞
      • 1)、安裝 ik 分詞器
      • 2)、測試分詞器
      • 3)、調整虛擬機內存大小
      • 4)、安裝nginx
      • 5)、自定義詞庫
  • 五、Elasticsearch-Rest-Client
    • 1、Rest客戶端選型
      • 1)、9300:TCP
      • 2)、9200:HTTP
    • 2、創建檢索服務
    • 3、SpringBoot 整合
    • 4、配置
    • 5、使用

一、ES簡介

1、網址

https://www.elastic.co/cn/what-is/elasticsearch
Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫代碼去調用它的接口。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。
REST API:天然的跨平臺。
官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
社區中文:
https://es.xiaoleilu.com/index.html
http://doc.codingdict.com/elasticsearch/0/
開源的 Elasticsearch 是目前全文搜索引擎的首選。
它可以快速地儲存、搜索和分析海量數據

2、基本概念

1、Index(索引)

動詞,相當于 MySQL 中的 insert;
名詞,相當于 MySQL 中的 Database

2、Type(類型)

在 Index(索引)中,可以定義一個或多個類型。
類似于 MySQL 中的 Table;每一種類型的數據放在一起;

3、Document(文檔)

保存在某個索引(Index)下,某種類型(Type)的一個數據(Document),文檔是 JSON 格式的,Document 就像是 MySQL 中的某個 Table 里面的內容;

4、倒排索引機制

4.1 正向索引和倒排索引

正向索引與倒排索引,這是在搜索領域中非常重要的兩個名詞,正向索引通常用于數據庫中,在搜索引擎領域使用的最多的就是倒排索引,我們根據如下兩個網頁來對這兩個概念進行闡述:
html1
我愛我的祖國,我愛編程
html2
我愛編程,我是個快樂的小碼農

4.2 正向索引

假設我們使用mysql的全文檢索,會對如上兩句話分別進行分詞處理,那么預計得到的結果如下:
我 愛 愛我 祖國 我的祖國 編程 愛編程 我愛編程
我 我愛 愛 編程 愛編程 我愛編程 快樂 碼農 小碼農

假設我們現在使用正向索引搜索 編程 這個詞,那么會到第一句話中去查找是否包含有 編程 這個關鍵詞,如果有則加入到結果集中;第二句話也是如此。假設現在有成千上百個網頁,每個網頁非常非常的分詞,那么搜索的效率將會非常非常低些。

4.3 倒排索引

倒排索引是按照分詞與文檔進行映射,我們來看看如果按照倒排索引的效果:
在這里插入圖片描述
如果采用倒排索引的方式搜索 編程 這個詞,那么會直接找到關鍵詞中查找到 編程 ,然后查找到對應的文檔,這就是所謂的倒排索引。

3、相關軟件及下載地址

Elasticsearch: https://www.elastic.co/cn/start
Kibana: https://www.elastic.co/cn/start
Logstash: https://www.elastic.co/cn/downloads/logstash

3.1 Kibana簡介

Kibana是世界上最受歡迎的開源日志分析平臺ELK Stack中的“K” ,它為用戶提供了一個工具,用于在存儲于Elasticsearch集群中的日志數據進行檢索,可視化和構建儀表板。
Kibana的核心功能是數據查詢和分析。使用各種方法,用戶可以搜索Elasticsearch中索引的數據,以查找其數據中的特定事件或字符串,以進行根本原因分析和診斷。基于這些查詢,用戶可以使用Kibana的可視化功能,允許用戶使用圖表,表格,地理圖和其他類型的可視化以各種不同的方式可視化數據。

3.2 logstash簡介

Logstash是一個開源的服務器端數據處理管道,可以同時從多個數據源獲取數據,并對其進行轉換,然后將其發送到你最喜歡的“存儲”。創建于2009年,于2013年被elasticsearch收購。

二、Docker安裝ES

1、下載鏡像文件

docker pull elasticsearch:7.4.2 存儲和檢索數據
docker pull kibana:7.4.2 可視化檢索數據
在這里插入圖片描述

2、創建實例

1、ElasticSearch

mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/ 保證權限
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

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

在這里插入圖片描述

以后再外面裝好插件重啟即可;
特別注意:
-e ES_JAVA_OPTS=“-Xms64m -Xmx256m” \ 測試環境下,設置 ES 的初始內存和最大內存,否則導致過大啟動不了 ES,生產環境也需要指定一下初始內存和最大內容,要不然會全部占用服務器的內存。

/mydata/elasticsearch 下面的權限必須設置為777,要不然會啟動失敗。
如果啟動失敗可以看下日志:docker logs CONTAINER ID

2、Kibana

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \
-d kibana:7.4.2

http://192.168.56.10:9200 一定改為自己虛擬機的地址

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

三、初步檢索

1、_cat

GET /_cat/nodes:查看所有節點
GET /_cat/health:查看 es 健康狀況
GET /_cat/master:查看主節點
GET /_cat/indices:查看所有索引 show databases;
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2、索引一個文檔(保存)

保存一個數據,保存在哪個索引的哪個類型下,指定用哪個唯一標識
PUT customer/external/1;在 customer 索引下的 external 類型下保存 1 號數據為

PUT customer/external/1
{ "name": "John Doe"
}

PUT 和 POST 都可以,
POST 新增。如果不指定 id,會自動生成 id。指定 id 就會修改這個數據,并新增版本號。
PUT 可以新增可以修改。PUT 必須指定 id;由于 PUT 需要指定 id,我們一般都用來做修改操作,不指定 id 會報錯。

3、查詢文檔

GET customer/external/1
結果:
{ "_index": "customer", //在哪個索引
"_type": "external", //在哪個類型
"_id": "1", //記錄 id
"_version": 2, //版本號
"_seq_no": 1, //并發控制字段,每次更新就會+1,用來做樂觀鎖
"_primary_term": 1, //同上,主分片重新分配,如重啟,就會變化
"found": true, "_source": { //真正的內容
"name": "John Doe"
}
}

更新攜帶 ?if_seq_no=0&if_primary_term=1

4、更新文檔

POST customer/external/1/_update
{ "doc":{ "name": "John Doew"
}
}
或者
POST customer/external/1
{ "name": "John Doe2"
}
或者
PUT customer/external/1
{ "name": "John Doe"
}

? 不同:POST 操作會對比源文檔數據,如果相同不會有什么操作,文檔 version 不增加
PUT 操作總會將數據重新保存并增加 version 版本;
帶_update 對比元數據如果一樣就不進行任何操作。
看場景;
對于大并發更新,不帶 update;
對于大并發查詢偶爾更新,帶 update;對比更新,重新計算分配規則。
? 更新同時增加屬性
POST customer/external/1/_update
{ “doc”: { “name”: “Jane Doe”, “age”: 20 }
}
PUT 和 POST 不帶_update 也可以。

5、刪除文檔&索引

DELETE customer/external/1
DELETE customer

6、bulk 批量 API

POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
語法格式:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
復雜實例:
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }

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

bulk API 以此按順序執行所有的 action(動作)。如果一個單個的動作因任何原因而失敗,它將繼續處理它后面剩余的動作。當 bulk API 返回時,它將提供每個動作的狀態(與發送的順序相同),所以您可以檢查是否一個指定的動作是不是失敗了。

7、樣本測試數據

我準備了一份顧客銀行賬戶信息的虛構的 JSON 文檔樣本。每個文檔都有下列的 schema(模式):

{ "account_number": 0, "balance": 16623, "firstname": "Bradshaw", "lastname": "Mckenzie", "age": 29, "gender": "F", "address": "244 Columbus Place", "employer": "Euron", "email": "bradshawmckenzie@euron.com", "city": "Hobucken", "state": "CO"
}

https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json?raw=true 導入測試數據
POST bank/account/_bulk
測試數據

四、進階檢索

1、SearchAPI

ES 支持兩種基本方式檢索 :
? 一個是通過使用 REST request URI 發送搜索參數(uri+檢索參數)
? 另一個是通過使用 REST request body 來發送它們(uri+請求體)

1)、檢索信息

? 一切檢索從_search 開始

GET bank/_search 檢索 bank 下所有信息,包括 type 和 docs
GET bank/_search?q=*&sort=account_number:asc 請求參數方式檢索
響應結果解釋:
took - Elasticsearch 執行搜索的時間(毫秒)
time_out - 告訴我們搜索是否超時
_shards - 告訴我們多少個分片被搜索了,以及統計了成功/失敗的搜索分片
hits - 搜索結果
hits.total - 搜索結果
hits.hits - 實際的搜索結果數組(默認為前 10 的文檔)
sort - 結果的排序 key(鍵)(沒有則按 score 排序)
score 和 max_score –相關性得分和最高得分(全文檢索用)

? uri+請求體進行檢索

GET bank/_search
{ "query": { "match_all": {}
},"sort": [
{ "account_number": { "order": "desc"
}
}
]
}

HTTP 客戶端工具(POSTMAN),get 請求不能攜帶請求體,我們變為 post 也是一樣的我們 POST 一個 JSON 風格的查詢請求體到 _search API。
需要了解,一旦搜索的結果被返回,Elasticsearch 就完成了這次請求,并且不會維護任何服務端的資源或者結果的 cursor(游標).

2、Query DSL((domain-specific language 領域特定語言)

1)、基本語法格式

Elasticsearch 提供了一個可以執行查詢的 Json 風格的 DSL(domain-specific language 領域特定語言)。這個被稱為 Query DSL。該查詢語言非常全面,并且剛開始的時候感覺有點復雜,真正學好它的方法是從一些基礎的示例開始的。
? 一個查詢語句 的典型結構

{
QUERY_NAME: {
ARGUMENT: VALUE, ARGUMENT: VALUE,... }
}
? 如果是針對某個字段,那么它的結構如下:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE, ARGUMENT: VALUE,... }
}
}
GET bank/_search
{ "query": { "match_all": {}
},"from": 0, "size": 5, "sort": [
{ "account_number": { "order": "desc"
}
}
]
}

? query 定義如何查詢,
? match_all 查詢類型【代表查詢所有的所有】,es 中可以在 query 中組合非常多的查
詢類型完成復雜查詢
? 除了 query 參數之外,我們也可以傳遞其它的參數以改變查詢結果。如 sort,size
? from+size 限定,完成分頁功能
? sort 排序,多字段排序,會在前序字段相等時后續字段內部排序,否則以前序為準

2)、返回部分字段

GET bank/_search
{ "query": {
"match_all": {}
},"from": 0, "size": 5, "_source": ["age","balance"]
}

3)、match【匹配查詢】

? 基本類型(非字符串),精確匹配

GET bank/_search
{ "query": { "match": { "account_number": "20"
}
}
}
match 返回 account_number=20

? 字符串,全文檢索

GET bank/_search
{ "query": { "match": { "address": "mill"
}
}
}
最終查詢出 address 中包含 mill 單詞的所有記錄
match 當搜索字符串類型的時候,會進行全文檢索,并且每條記錄有相關性得分。

? 字符串,多個單詞(分詞+全文檢索)

GET bank/_search
{ "query": { "match": { "address": "mill road"
}
}
}
最終查詢出 address 中包含 mill 或者 road 或者 mill road 的所有記錄,并給出相關性得分

4)、match_phrase【短語匹配】

將需要匹配的值當成一個整體單詞(不分詞)進行檢索

GET bank/_search
{ "query": { "match_phrase": { "address": "mill road"
}
}
}
查出 address 中包含 mill road 的所有記錄,并給出相關性得分

5)、multi_match【多字段匹配】

GET bank/_search
{ "query": { "multi_match": { "query": "mill", "fields": ["state","address"]
}
}
}
state 或者 address 包含 mill

6)、bool【復合查詢】

bool 用來做復合查詢:
復合語句可以合并 任何 其它查詢語句,包括復合語句,了解這一點是很重要的。這就意味著,復合語句之間可以互相嵌套,可以表達非常復雜的邏輯。

? must:必須達到 must 列舉的所有條件
GET bank/_search
{ "query": { "bool": { "must": [
{ "match": { "address": "mill" } },
{ "match": { "gender": "M" } }
]
}
}
}
? should:應該達到 should 列舉的條件,如果達到會增加相關文檔的評分,并不會改變
查詢的結果。如果 query 中只有 should 且只有一種匹配規則,那么 should 的條件就會
被作為默認匹配條件而去改變查詢結果
GET bank/_search
{ "query": { "bool": { "must": [
{ "match": { "address": "mill" } }, { "match": { "gender": "M" } }
],"should": [
{"match": { "address": "lane" }}
]
}
}
}
? must_not 必須不是指定的情況
GET bank/_search
{ "query": { "bool": { "must": [
{ "match": { "address": "mill" } }, { "match": { "gender": "M" } }
],"should": [
{"match": { "address": "lane" }}
],"must_not": [
{"match": { "email": "baluba.com" }}
]
}
}
}
address 包含 mill,并且 gender 是 M,如果 address 里面有 lane 最好不過,但是 email 必
須不包含 baluba.com

在這里插入圖片描述

7)、filter【結果過濾】

并不是所有的查詢都需要產生分數,特別是那些僅用于 “filtering”(過濾)的文檔。為了不
計算分數 Elasticsearch 會自動檢查場景并且優化查詢的執行。
GET bank/_search
{ "query": { "bool": { "must": [
{"match": { "address": "mill"}}
],"filter": { "range": { "balance": { "gte": 10000, "lte": 20000
}
}
}
}
}
}

8)、term

和 match 一樣。匹配某個屬性的值。全文檢索字段用 match,其他非 text 字段匹配用 term。

GET bank/_search
{ "query": { "bool": { "must": [
{"term": { "age": { "value": "28"
}
}}, {"match": { "address": "990 Mill Road"
}}
]
}
}
}

9)、aggregations(執行聚合)
聚合提供了從數據中分組和提取數據的能力。最簡單的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函數。在 Elasticsearch 中,您有執行搜索返回 hits(命中結果),并且同時返回聚合結果,把一個響應中的所有 hits(命中結果)分隔開的能力。這是非常強大且有效的,
您可以執行查詢和多個聚合,并且在一次使用中得到各自的(任何一個的)返回結果,使用一次簡潔和簡化的 API 來避免網絡往返。

? 搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡,但不顯示這些人的詳情。
GET bank/_search
{ "query": { "match": { "address": "mill"
}
},"aggs": { "group_by_state": { "terms": { "field": "age"
}
},"avg_age": { "avg": {
"field": "age"
}
}
},"size": 0
}
size:0 不顯示搜索數據
aggs:執行聚合。聚合語法如下
"aggs": { "aggs_name 這次聚合的名字,方便展示在結果集中": { "AGG_TYPE 聚合的類型(avg,term,terms)": {}
}
},
復雜:
按照年齡聚合,并且請求這些年齡段的這些人的平均薪資
GET bank/account/_search
{ "query": { "match_all": {}
},"aggs": { "age_avg": { "terms": { "field": "age", "size": 1000
},"aggs": { "banlances_avg": { "avg": { "field": "balance"
}
}
}
}
}
,"size": 1000
}
復雜:查出所有年齡分布,并且這些年齡段中 M 的平均薪資和 F 的平均薪資以及這個年齡
段的總體平均薪資
GET bank/account/_search
{ "query": { "match_all": {}
},"aggs": { "age_agg": { "terms": { "field": "age", "size": 100
},"aggs": { "gender_agg": { "terms": { "field": "gender.keyword", "size": 100
},"aggs": { "balance_avg": { "avg": { "field": "balance"
}
}
}
},"balance_avg":{ "avg": { "field": "balance"
}
}
}
}
}
,"size": 1000
}

3、Mapping

1)、字段類型

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

2)、映射

Mapping(映射)
Mapping 是用來定義一個文檔(document),以及它所包含的屬性(field)是如何存儲和索引的。比如,使用 mapping 來定義:
? 哪些字符串屬性應該被看做全文本屬性(full text fields)。
? 哪些屬性包含數字,日期或者地理位置。
? 文檔中的所有屬性是否都能被索引(_all 配置)。
? 日期的格式。
? 自定義映射規則來執行動態添加屬性。
? 查看 mapping 信息:
GET bank/_mapping
? 修改 mapping 信息
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
在這里插入圖片描述

3)、新版本改變

Es7 及以上移除了 type 的概念。
? 關系型數據庫中兩個數據表示是獨立的,即使他們里面有相同名稱的列也不影響使用,
但 ES 中不是這樣的。elasticsearch 是基于 Lucene 開發的搜索引擎,而 ES 中不同 type
下名稱相同的 filed 最終在 Lucene 中的處理方式是一樣的。
? 兩個不同 type 下的兩個 user_name,在 ES 同一個索引下其實被認為是同一個 filed,你必須在兩個不同的 type 中定義相同的 filed 映射。否則,不同 type 中的相同字段名稱就會在處理中出現沖突的情況,導致 Lucene 處理效率下降。
? 去掉 type 就是為了提高 ES 處理數據的效率。
Elasticsearch 7.x
? URL 中的 type 參數為可選。比如,索引一個文檔不再要求提供文檔類型。
Elasticsearch 8.x
? 不再支持 URL 中的 type 參數。
解決:
1)、將索引從多類型遷移到單類型,每種類型文檔一個獨立索引
2)、將已存在的索引下的類型數據,全部遷移到指定位置即可。詳見數據遷移

1、創建映射
1、創建索引并指定映射
PUT /my-index
{ "mappings": { "properties": {
"age": { "type": "integer" }, "email": { "type": "keyword" }, "name": { "type": "text" }
}
}
}
2、添加新的字段映射
PUT /my-index/_mapping
{ "properties": { "employee-id": { "type": "keyword", "index": false
}
}
}

3、更新映射
對于已經存在的映射字段,我們不能更新。更新必須創建新的索引進行數據遷移

4、數據遷移
先創建出 new_twitter 的正確映射。然后使用如下方式進行數據遷移
POST _reindex [固定寫法]
{ "source": { "index": "twitter"
},"dest": { "index": "new_twitter"
}
}
將舊索引的 type 下的數據進行遷移
POST _reindex
{ "source": {
"index": "twitter", "type": "tweet"
},"dest": { "index": "tweets"
}
}

4、分詞

一個 tokenizer(分詞器)接收一個字符流,將之分割為獨立的 tokens(詞元,通常是獨立的單詞),然后輸出 tokens 流。
例如,whitespace tokenizer 遇到空白字符時分割文本。它會將文本 “Quick brown fox!” 分割為 [Quick, brown, fox!]。
該 tokenizer(分詞器)還負責記錄各個 term(詞條)的順序或 position 位置(用于 phrase 短語和 word proximity 詞近鄰查詢),以及 term(詞條)所代表的原始 word(單詞)的 start(起始)和 end(結束)的 character offsets(字符偏移量)(用于高亮顯示搜索的內容)。
Elasticsearch 提供了很多內置的分詞器,可以用來構建 custom analyzers(自定義分詞器)。

1)、安裝 ik 分詞器

注意:不能用默認 elasticsearch-plugin install xxx.zip 進行自動安裝
https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.4.2 對應 es 版本安裝

進入 es 容器內部 plugins 目錄
docker exec -it 容器 id /bin/bash
wget
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-anal
ysis-ik-7.4.2.zip
unzip 下載的文件
rm –rf *.zip
mv elasticsearch/ ik
可以確認是否安裝好了分詞器
cd ../bin
elasticsearch plugin list:即可列出系統的分詞器

在這里插入圖片描述
在這里插入圖片描述
因為容器里面只有核心的軟件,因此沒有wget,可以直接去外面的安裝wget,在外面下載wget,最好不要在容器里面下載,增加容器內容。

yum install wget

在這里插入圖片描述
在外面解壓好上傳上去

在這里插入圖片描述
容器一旦啟動,最好不要刪除里面的掛載目錄,要不然就需要重啟容器重新掛載一下目錄。
在這里插入圖片描述
安裝好分詞器后,需要重新啟動一下容器,加載插件。

docker restart elasticsearch

在這里插入圖片描述

2)、測試分詞器

使用默認
POST _analyze
{ "text": "我是中國人"
}
請觀察結果
使用分詞器
POST _analyze
{ "analyzer": "ik_smart", "text": "我是中國人"
}
請觀察結果
另外一個分詞器
ik_max_word
POST _analyze
{ "analyzer": "ik_max_word", "text": "我是中國人"
}

請觀察結果
能夠看出不同的分詞器,分詞有明顯的區別,所以以后定義一個索引不能再使用默認的 mapping 了,要手工建立 mapping, 因為要選擇分詞器。
在這里插入圖片描述

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

3)、調整虛擬機內存大小

1、關閉虛擬機
2、打開設置里面的系統,調到3G。
3、然后無界面啟動虛擬機,再啟動容器。
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

4)、安裝nginx

先在mydata下面創建nginx目錄,以后所有的nginx文件都放到這個目錄下面
在這里插入圖片描述
? 隨便啟動一個 nginx 實例,只是為了復制出配置

 docker run -p 80:80 --name nginx -d nginx:1.10

本地沒有找到鏡像會自動下載并啟動
在這里插入圖片描述

? 將容器內的配置文件拷貝到當前目錄(別忘了后面的點):

docker container cp nginx:/etc/nginx .  

nginx容器下的/etc/nginx目錄下的文件 拷貝到剛才創建的nginx文件夾下
在這里插入圖片描述

? 修改文件名稱:mv nginx conf
把這個 conf 移動到/mydata/nginx 下
在這里插入圖片描述

? 終止原容器:docker stop nginx
? 執行命令刪除原容器:docker rm $ContainerId
? 創建新的 nginx;執行以下命令

docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

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

去nginx外部掛載目錄,html下,創建index.html,編寫html頁面,請求就能夠默認展示,說明nginx是ok的。(nginx會自動默認訪問html文件夾下面的內容,默認訪問index.html頁面,因此請求http://192.168.56.10:80,就是請求http://192.168.56.10/index.html,80是默認端口含,不展示
在nginx下面的html文件夾下面創建es文件夾,有關的es文件就放到里面,給 nginx 的 html 下面放的所有資源可以直接訪問;
在這里插入圖片描述
http://192.168.56.10/es/fenci.txt
在這里插入圖片描述

5)、自定義詞庫

修改/usr/share/elasticsearch/plugins/ik/config/中的 IKAnalyzer.cfg.xml
/usr/share/elasticsearch/plugins/ik/config

在這里插入圖片描述

<?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"></entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords"></entry>
<!--用戶可以在這里配置遠程擴展字典 -->
<entry key="remote_ext_dict">http://192.168.128.130/fenci/myword.txt</entry>
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
原來的 xml
<?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"></entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords"></entry>
<!--用戶可以在這里配置遠程擴展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

在這里插入圖片描述
按照遠程擴展字典的路徑利用 nginx 發布靜態資源,按照請求路徑,創建對應的文件夾以及文件,放在nginx 的 html 下
然后重啟 es 服務器,重啟 nginx。
在這里插入圖片描述
修改es一直自動重啟,這樣修改配置,es就會自動重啟:

 docker update  elasticsearch --restart=always

在這里插入圖片描述

在 kibana 中測試分詞效果
在這里插入圖片描述

更新完成后,es 只會對新增的數據用新詞分詞。歷史數據是不會重新分詞的。如果想要歷史數據重新分詞。需要執行:
POST my_index/_update_by_query?conflicts=proceed

五、Elasticsearch-Rest-Client

1、Rest客戶端選型

1)、9300:TCP

? spring-data-elasticsearch:transport-api.jar;
? springboot 版本不同, transport-api.jar 不同,不能適配 es 版本
? 7.x 已經不建議使用,8 以后就要廢棄

2)、9200:HTTP

? JestClient:非官方,更新慢
? RestTemplate:模擬發 HTTP 請求,ES 很多操作需要自己封裝,麻煩
? HttpClient:同上
? Elasticsearch-Rest-Client:官方 RestClient,封裝了 ES 操作,API 層次分明,上手簡單
最終選擇 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

2、創建檢索服務

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
配置服務注冊和配置中心。

3、SpringBoot 整合

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>

在這里插入圖片描述

發現其中的依賴有6.4.3版本,因為我們是spring-boot下spring-boot-dependencies對es也做了版本管理
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
然后我們在子項目配置中引用的版本設置為7.4.2
在這里插入圖片描述
刷新一下,就全部變成7.4.2了在這里插入圖片描述

4、配置

@Bean
RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));
return new RestHighLevelClient(builder);
}

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

5、使用

參照官方文檔:
@Test
void test1() throws IOException {
Product product = new Product();
product.setSpuName("華為");
product.setId(10L);
IndexRequest request = new IndexRequest("product").id("20")
.source("spuName","華為","id",20L);
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(request.toString());
IndexResponse response2 = client.index(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
}

在這里插入圖片描述

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

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

相關文章

【C++深入淺出】初識C++上篇(關鍵字,命名空間,輸入輸出,缺省參數,函數重載)

目錄 一. 前言 二. 什么是C 三. C關鍵字初探 四. 命名空間 4.1 為什么要引入命名空間 4.2 命名空間的定義 4.3 命名空間使用 五. C的輸入輸出 六. 缺省參數 6.1 缺省參數的概念 6.2 缺省參數的分類 七. 函數重載 7.1 函數重載的概念 7.2 函數重載的條件 7.3 C支…

ChatGPT在智能家居控制和環境管理中的應用如何?

智能家居控制和環境管理是近年來在科技領域迅速發展的重要領域之一。智能家居技術通過將物聯網、人工智能和自動化技術相結合&#xff0c;實現了家居設備的智能化、自動化控制和遠程管理。ChatGPT作為強大的自然語言處理模型&#xff0c;在智能家居控制和環境管理方面具有廣泛的…

軟件測試項目實戰,電商業務功能測試點匯總(全覆蓋)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 支付功能怎么測試…

Spring--BeanFactory和FactoryBean區別

BeanFactory 和 FactoryBean 是 Spring 框架中兩個不同的概念&#xff0c;它們在對象的管理和創建過程中具有不同的角色和功能。下面是它們之間的區別&#xff1a; BeanFactory&#xff1a; BeanFactory 是 Spring 框架的核心接口之一&#xff0c;它是一個對象容器&#xff0c…

C語言刷題訓練【第11天】

大家好&#xff0c;我是紀寧。 今天是C語言筆試刷題訓練的第11天&#xff0c;加油&#xff01; 文章目錄 1、聲明以下變量&#xff0c;則表達式: ch/i (f*d – i) 的結果類型為&#xff08; &#xff09;2、關于代碼的說法正確的是&#xff08; &#xff09;3、已知有如下各變…

使用 Visual Studio GoogleTest編寫 C/C++ 單元測試——入門篇

入門教程 Visual Studio 新建 GoogleTest項目&#xff0c;一路選默認參數 pch.h #pragma once#include "gtest/gtest.h"int add(int a, int b);pch.cpp #include "pch.h"int add(int a, int b) {return a b; }test.cpp #include "pch.h"TES…

【廣州華銳視點】AR電力職業技能培訓系統讓技能學習更“智慧”

隨著科技的發展&#xff0c;教育方式也在不斷地進步和創新。其中&#xff0c;增強現實(AR)技術的出現&#xff0c;為教育領域帶來了全新的可能。AR電力職業技能培訓系統就是這種創新教學方法的完美實踐&#xff0c;它將虛擬與現實相結合&#xff0c;為學生提供了一個沉浸式的學…

【數據庫】Sql Server可視化工具SSMS條件和SQL窗格以及版本信息

2023年&#xff0c;第34周&#xff0c;第1篇文章。給自己一個目標&#xff0c;然后堅持總會有收貨&#xff0c;不信你試試&#xff01; SQL SERVER 官方本身就有數據庫可視化管理工具SSMS&#xff0c;所以大部分都會使用SSMS。以前版本是直接捆綁&#xff0c; 安裝完成就自帶有…

Python多線程與線程池(python線程池ThreadPoolExecutor)concurrent.futures高級別異步執行封裝

文章目錄 Python多線程與線程池一、Python多線程1.1 線程簡介1.2 Python中的多線程1.3 GIL限制 二、線程池2.1 Python中的線程池 三、代碼分析四、參考資料 Python多線程與線程池 一、Python多線程 在進行復雜的計算或處理大量數據時&#xff0c;可以通過創建多個線程來同時執…

Sentinel規則持久化

首先 Sentinel 控制臺通過 API 將規則推送至客戶端并更新到內存中&#xff0c;接著注冊的寫數據源會將新的規則保存到本地的文件中。 示例代碼&#xff1a; 1.編寫處理類 //規則持久化 public class FilePersistence implements InitFunc {Value("spring.application:n…

云原生k8s---資源限制、探針

目錄 一&#xff1a;資源限制 1、資源限制原因 2、Pod 和 容器 的資源請求和限制 3、CPU 資源單位 4、內存 資源單位 5、事例 &#xff08;1&#xff09;事例一 &#xff08;2&#xff09;事例二 二&#xff1a;重啟策略 1、重啟策略模式 2、事例 三&#xff1a;探針…

Win10提醒事項如何打開?電腦上如何添加日程提醒?

有不少上班族表示自己在日常辦公時&#xff0c;經常會忘記一些重要的事情&#xff0c;例如領導安排給自己的任務、會議安排、項目截止日期等。為了避免自己忘記工作事項&#xff0c;很多人都想要在電腦上設置提醒事項或添加日程提醒。那么Win10提醒事項如何打開呢&#xff1f;P…

Golang 中的 archive/zip 包詳解(一):實現 ZIP 壓縮與解壓

Golang 中的 archive/zip 包用于處理 ZIP 格式的壓縮文件&#xff0c;提供了一系列用于創建、讀取和解壓縮 ZIP 格式文件的函數和類型&#xff0c;使用起來非常方便。 實現壓縮功能 1、首先需要創建一個 zip 文件。 zip 文件也是一個文件&#xff0c;首先需要創建一個基礎的…

[Leetcode] [Tutorial] 多維動態規劃(未完待續)

文章目錄 62. 不同路徑Solution 62. 不同路徑 一個機器人位于一個 m ? * ? n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角。 問總共有多少條不同的路徑&#xff1f; 示例…

【electron】electron項目創建的方式:

文章目錄 【1】npm init quick-start/electron&#xff08;推薦&#xff09;【2】 克隆倉庫&#xff0c;快速啟動【3】 通過腳手架搭建項目【4】 手動創建項目 【Electron官網】https://www.electronjs.org/zh/docs/latest/api/app 【1】npm init quick-start/electron&#xf…

Excelize Go語言操作 Office Excel文檔基礎庫

Excelize 是 Go 語言編寫的用于操作 Office Excel 文檔基礎庫&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 國際標準。可以使用它來讀取、寫入由 Microsoft Excel? 2007 及以上版本創建的電子表格文檔。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多種文檔格式&#xf…

微信小程序實現左滑刪除

一、效果 二、代碼 實現思路使用的是官方提供的 movable-area&#xff1a;注意點&#xff0c;需要設置其高度&#xff0c;否則會出現列表內容重疊的現象。由于movable-view需要向右移動&#xff0c;左滑的時候給刪除控件展示的空間&#xff0c;故 movable-area 需要左移 left:…

Android Gradle Plug-in(AGP ) 的對應關系

AGP 和 Gradle 版本的對應關系 Android Gradle 插件版本說明 | Android 開發者 | Android Developers 插件版本所需的最低 Gradle 版本8.18.08.08.07.47.57.37.47.27.3.37.17.27.07.04.2.06.7.1 舊版 插件版本所需的 Gradle 版本4.1.06.54.0.06.1.13.6.0 - 3.6.45.6.4…

sqlloader學習筆記

INFILE的用法 1&#xff09;模糊導入多個數據的文件。 可以在文件名中使用通配符。 星號 &#xff08;*&#xff09; 表示復數字符&#xff0c;問號 &#xff08;&#xff1f;&#xff09; 表示單個字符。 INFILE emp*.dat INFILE m?emp.dat 2&#xff09;如果不需要導入數據…

jQuery EasyUI datagrid 無記錄時,增加“暫無數據“提示

我們只需要在onLoadSuccess中添加如下代碼&#xff1a; if (data.total 0) {var body $(this).data().datagrid.dc.body2;body.find(table tbody).append(<tr><td width" body.width() " style"height: 35px; text-align: center;"><h…