簡介
https://www.elastic.co/cn/what-is/elasticsearch
全文搜索屬于最常見的需求,開源的Elasticsearch是目前全文搜索引擎的首選。 它可以快速地儲存、搜索和分析海量數(shù)據(jù)。
維基百科、StackOverflow、Github都采用它。
Elastic的底層是開源庫Lucene。但是,你沒法直接用Lucene,必須自己寫代碼去調(diào)用它的 接口。Elastic是Lucene的封裝,提供了RESTAPI的操作接口,開箱即用。
RESTAPI:天然的跨平臺。
- 官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
- 官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
- 社區(qū)中文:
- https://es.xiaoleilu.com/index.html
- http://doc.codingdict.com/elasticsearch/0/
一、基本概念
1、Index(索引)
動詞,相當(dāng)于MySQL中的insert;
名詞,相當(dāng)于MySQL中的Database
2、Type(類型)
在Index(索引)中,可以定義一個或多個類型。
類似于MySQL中的Table;每一種類型的數(shù)據(jù)放在一起;
3、Document(文檔)
保存在某個索引(Index)下,某種類型(Type)的一個數(shù)據(jù)(Document),文檔是JSON格 式的,Document就像是MySQL中的某個Table里面的內(nèi)容;
4、倒排索引機制
-- es為什么去掉type:
關(guān)系型數(shù)據(jù)庫中兩個數(shù)據(jù)表示是獨立的,即使他們里面有相同名稱的列也不影響使用,但ES 中不是這樣的。elasticsearch是基于Lucene開發(fā)的搜索引擎,而ES中不同type下名稱相同 的filed最終在Lucene中的處理方式是一樣的。
????????? 兩個不同type下的兩個user_name,在ES同一個索引下其實被認(rèn)為是同一個filed,你必 須在兩個不同的type中定義相同的filed映射。否則,不同type中的相同字段名稱就會在 處理中出現(xiàn)沖突的情況,導(dǎo)致Lucene處理效率下降。
????????? 去掉type就是為了提高ES處理數(shù)據(jù)的效率。
----
? Elasticsearch 7.x ? URL中的type參數(shù)為可選。比如,索引一個文檔不再要求提供文檔類型。
? Elasticsearch 8.x ? 不再支持URL中的type參數(shù)。
? 解決:將索引從多類型遷移到單類型,每種類型文檔一個獨立索引
二、Docker 安裝 Es
docker教程:
1、下載鏡像文件
docker pull elasticsearch:7.4.2 存儲和檢索數(shù)據(jù)
docker pull kibana:7.4.2 可視化檢索數(shù)據(jù)
2、創(chuàng)建實例
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/ 保證權(quán)限
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" \ 測試環(huán)境下,設(shè)置ES 的初始內(nèi)存和最大內(nèi)存,否則導(dǎo) 致過大啟動不了ES
2.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:查看所有節(jié)點
- GET /_cat/health:查看 es 健康狀況
- GET /_cat/master:查看主節(jié)點
- GET /_cat/indices:查看所有索引 showdatabases;
2、索引一個文檔(保存)
保存一個數(shù)據(jù),保存在哪個索引的哪個類型下,指定用哪個唯一標(biāo)識
PUT customer/external/1;
在 customer 索引下的 external 類型下保存 1 號數(shù)據(jù)為
PUT customer/external/1
{
????"name":?"JohnDoe"
}
PUT和POST都可以,
- POST可以新增可以修改。
- 如果不指定id,會自動生成id,表示新增。
- 如果指定id:id不存在就新增,ID存在就修改,并新增版本號
- PUT可以新增可以修改。
- PUT必須指定id,id不存在就新增,ID存在就修改;
- 由于PUT需要指定id,我們一般都用來做修改 操作,不指定id會報錯。
3、查詢文檔
GET customer/external/1
結(jié)果:
{
????"_index":?"customer",?//在哪個索引
????"_type":?"external",?//在哪個類型
????"_id":?"1",?//記錄id
????"_version":?2,?//版本號
????"_seq_no":?1,?//并發(fā)控制字段,每次更新就會+1,用來做樂觀鎖
????"_primary_term":?1,?//同上,主分片重新分配,如重啟,就會變化
????"found":?true,
????"_source":?{?//真正的內(nèi)容
????????"name":?"JohnDoe"
????}
}
(樂觀鎖操作)更新攜帶
PUT customer/external/1?if_seq_no=1&if_primary_term=1
4、更新文檔
POST?customer/external/1/_update?{
????"doc":?{
????????"name":?"JohnDoew"
????}
}
或者?
POST?customer/external/1?
{
????"name":?"JohnDoe2"
}
或者?
PUT?customer/external/1?
{
????"name":?"JohnDoe"
}
不同:
- POST帶_update操作會對比源文檔數(shù)據(jù),如果相同不會有什么操作,文檔version不增加。
- POST不帶_update操作,總會將數(shù)據(jù)重新保存并增加version版本;
- PUT操作,總會將數(shù)據(jù)重新保存并增加version版本;
POST帶_update對比元數(shù)據(jù)如果一樣就不進(jìn)行任何操作。
看場景;
對于大并發(fā)更新,不帶update;
對于大并發(fā)查詢偶爾更新,帶update;對比更新,重新計算分配規(guī)則。
更新同時增加屬性
POST customer/external/1/_update
?{
????"doc":?{
????????"name":?"JaneDoe",
????????"age":?20
????}
}
?PUT和POST不帶_update也可以
5、刪除文檔&索引
DELETE customer/external/1
DELETE customer
6、bulk批量API
POSTcustomer/external/_bulk
{"index":{"_id":"1"}}
{"name":"JohnDoe"}
{"index":{"_id":"2"}}
{"name":"JaneDoe"}
語法格式:
{action:{metadata}}\n
{requestbody }\n
{action:{metadata}}\n
{requestbody }\n
復(fù)雜實例:
POST/_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title": "Myfirstblogpost"}
{"index": {"_index":"website","_type":"blog"}}
{"title": "Mysecondblogpost"}
{"update":{"_index":"website","_type":"blog","_id":"123","_retry_on_conflict":3}}
{"doc":{"title":"Myupdatedblogpost"}}
bulkAPI 以此按順序執(zhí)行所有的action(動作)。
如果一個單個的動作因任何原因而失敗, 它將繼續(xù)處理它后面剩余的動作。
當(dāng)bulkAPI返回時,它將提供每個動作的狀態(tài)(與發(fā)送 的順序相同),所以您可以檢查是否一個指定的動作是不是失敗了。
7、樣本測試數(shù)據(jù)
我準(zhǔn)備了一份顧客銀行賬戶信息的虛構(gòu)的JSON文檔樣本。每個文檔都有下列的schema (模式):
{
????"account_number":?0,
????"balance":?16623,
????"firstname":?"Bradshaw",
????"lastname":?"Mckenzie",
????"age":?29,
????"gender":?"F",
????"address":?"244ColumbusPlace",
????"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導(dǎo)入測試數(shù)據(jù)
POST bank/account/_bulk 測試數(shù)據(jù)
四、進(jìn)階檢索
1、SearchAPI
ES支持兩種基本方式檢索:
- 一個是通過使用 REST requestURI發(fā)送搜索參數(shù)(uri+檢索參數(shù))
- 另一個是通過使用REST requestbody來發(fā)送它們(uri+請求體)
1)、檢索信息
一切檢索從_search開始
GET bank/_search
檢索bank下所有信息,包括type和docs
請求參數(shù)方式檢索:
GET bank/_search?q=*&sort=account_number:asc
響應(yīng)結(jié)果解釋:
took-Elasticsearch執(zhí)行搜索的時間(毫秒)
time_out-告訴我們搜索是否超時
_shards-告訴我們多少個分片被搜索了,以及統(tǒng)計了成功/失敗的搜索分片
hits-搜索結(jié)果
hits.total-搜索結(jié)果
hits.hits-實際的搜索結(jié)果數(shù)組(默認(rèn)為前10的文檔)
sort-結(jié)果的排序key(鍵)(沒有則按score排序)
score和max_score–相關(guān)性得分和最高得分(全文檢索用)
uri+請求體進(jìn)行檢索:
GET bank/_search?
{
????"query":?{
????????"match_all":?{}
????},
????"sort":?[
????????{
????????????"account_number":?{
????????????????"order":?"desc"
????????????}
????????}
????]
}
HTTP客戶端工具(POSTMAN),get請求不能攜帶請求體,我們變?yōu)閜ost也是一樣的 我們POST一個JSON風(fēng)格的查詢請求體到_searchAPI。
需要了解,一旦搜索的結(jié)果被返回,Elasticsearch就完成了這次請求,并且不會維護(hù)任何 服務(wù)端的資源或者結(jié)果的cursor(游標(biāo))
2、QueryDSL
1)、基本語法格式
Elasticsearch提供了一個可以執(zhí)行查詢的Json風(fēng)格的DSL(domain-specificlanguage領(lǐng)域特 定語言)。這個被稱為QueryDSL。該查詢語言非常全面,并且剛開始的時候感覺有點復(fù)雜, 真正學(xué)好它的方法是從一些基礎(chǔ)的示例開始的。
- 一個查詢語句的典型結(jié)構(gòu)?
{
?QUERY_NAME:?{
?ARGUMENT:VALUE,
?ARGUMENT:VALUE,...
????}
}
- 如果是針對某個字段,那么它的結(jié)構(gòu)如下:
{
?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中組合非常多的查 詢類型完成復(fù)雜查詢
- 除了query參數(shù)之外,我們也可以傳遞其它的參數(shù)以改變查詢結(jié)果。如sort,size
- from+size限定,完成分頁功能
- sort排序,多字段排序,會在前序字段相等時后續(xù)字段內(nèi)部排序,否則以前序為準(zhǔn)
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當(dāng)搜索字符串類型的時候,會進(jìn)行全文檢索,并且每條記錄有相關(guān)性得分。
- 字符串,多個單詞(分詞+全文檢索)
GET?bank/_search
?{
????"query":?{
????????"match":?{
????????????"address":?"mill road"
????????}
????}
}
最終查詢出address中包含mill或者road或者millroad的所有記錄,并給出相關(guān)性得分
4)、match_phrase【短語匹配】
將需要匹配的值當(dāng)成一個整體單詞(不分詞)進(jìn)行檢索
GET?bank/_search
?{
????"query":?{
????????"match_phrase":?{
????????????"address":?"mill?road"
????????}
????}
}
查出address中包含mill road的所有記錄,并給出相關(guān)性得分
?5)、multi_match【多字段匹配】
GET?bank/_search
?{
????"query":?{
????????"multi_match":?{
????????????"query":?"mill",
????????????"fields":?[
????????????????"state",?"address"
????????????]
????????}
????}
}
?state或者address包含mil
6)、bool【復(fù)合查詢】?
bool用來做復(fù)合查詢:
復(fù)合語句可以合并任何其它查詢語句,包括復(fù)合語句,了解這一點是很重要的。這就意味 著,復(fù)合語句之間可以互相嵌套,可以表達(dá)非常復(fù)雜的邏輯。
- must:必須達(dá)到must列舉的所有條件
GET?bank/_search
?{
????"query":?{
????????"bool":?{
????????????"must":?[
????????????????{
????????????????????"match":?{
????????????????????????"address":?"mill"
????????????????????}
????????????????},
????????????????{
????????????????????"match":?{
????????????????????????"gender":?"M"
????????????????????}
????????????????}
????????????]
????????}
????}
}
- should:應(yīng)該達(dá)到should列舉的條件,如果達(dá)到會增加相關(guān)文檔的評分,并不會改變 查詢的結(jié)果。如果query中只有should且只有一種匹配規(guī)則,那么should的條件就會 被作為默認(rèn)匹配條件而去改變查詢結(jié)果
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里面有l(wèi)ane最好不過,但是email必
須不包含baluba.com
7)、filter【結(jié)果過濾】?
并不是所有的查詢都需要產(chǎn)生分?jǐn)?shù),特別是那些僅用于“filtering”(過濾)的文檔。為了不計算分?jǐn)?shù)Elasticsearch會自動檢查場景并且優(yōu)化查詢的執(zhí)行。
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":?"990MillRoad"
????????????????????}
????????????????}
????????????]
????????}
????}
}
9)、aggregations(執(zhí)行聚合)?
聚合提供了從數(shù)據(jù)中分組和提取數(shù)據(jù)的能力。
最簡單的聚合方法大致等于SQLGROUP BY和SQL聚合函數(shù)。在Elasticsearch中,您有執(zhí)行搜索返回hits(命中結(jié)果),并且同時返 回聚合結(jié)果,把一個響應(yīng)中的所有hits(命中結(jié)果)分隔開的能力。這是非常強大且有效的, 您可以執(zhí)行查詢和多個聚合,并且在一次使用中得到各自的(任何一個的)返回結(jié)果,使用 一次簡潔和簡化的API來避免網(wǎng)絡(luò)往返。
- 搜索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不顯示搜索數(shù)據(jù)
aggs:執(zhí)行聚合。聚合語法如下
"aggs":?{
????"aggs_name這次聚合的名字,方便展示在結(jié)果集中":?{
????????"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的平均薪資以及這個年齡 段的總體平均薪資
GETbank/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來定義:
- 哪些字符串屬性應(yīng)該被看做全文本屬性(fulltextfields)。
- 哪些屬性包含數(shù)字,日期或者地理位置。
- 文檔中的所有屬性是否都能被索引(_all配置)。
- 日期的格式。
- 自定義映射規(guī)則來執(zhí)行動態(tài)添加屬性。
查看mapping信息: GET bank/_mapping
修改mapping信息:Mapping | Elasticsearch Guide [8.13] | Elastic
3)、新版本改變
-- Es7及以上移除了type的概念:
關(guān)系型數(shù)據(jù)庫中兩個數(shù)據(jù)表示是獨立的,即使他們里面有相同名稱的列也不影響使用,但ES 中不是這樣的。elasticsearch是基于Lucene開發(fā)的搜索引擎,而ES中不同type下名稱相同 的filed最終在Lucene中的處理方式是一樣的。
????????? 兩個不同type下的兩個user_name,在ES同一個索引下其實被認(rèn)為是同一個filed,你必 須在兩個不同的type中定義相同的filed映射。否則,不同type中的相同字段名稱就會在 處理中出現(xiàn)沖突的情況,導(dǎo)致Lucene處理效率下降。
????????? 去掉type就是為了提高ES處理數(shù)據(jù)的效率。
----
? Elasticsearch 7.x
???????? ? URL中的type參數(shù)為可選。比如,索引一個文檔不再要求提供文檔類型。
? Elasticsearch 8.x
????????? 不再支持URL中的type參數(shù)。
? 解決:
1)、將索引從多類型遷移到單類型,每種類型文檔一個獨立索引
2)、將已存在的索引下的類型數(shù)據(jù),全部遷移到指定位置即可。詳見數(shù)據(jù)遷移
4)、映射操作
- 1、創(chuàng)建映射
1、創(chuàng)建索引并指定映射
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、更新映射
對于已經(jīng)存在的映射字段,我們不能更新。更新必須創(chuàng)建新的索引進(jìn)行數(shù)據(jù)遷移
- 4、數(shù)據(jù)遷移
先創(chuàng)建出new_twitter的正確映射。然后使用如下方式進(jìn)行數(shù)據(jù)遷移
POST_reindex?[固定寫法]
?{
????"source":?{
????????"index":?"twitter"
????},
????"dest":?{
????????"index":?"new_twitter"
????}
}
將舊索引的type下的數(shù)據(jù)進(jìn)行遷移
POST_reindex
?{
????"source":?{
????????"index":?"twitter",
????????"type":?"tweet"
????},
????"dest":?{
????????"index":?"tweets"
????}
}
4、分詞
一個tokenizer(分詞器)接收一個字符流,將之分割為獨立的tokens(詞元,通常是獨立 的單詞),然后輸出tokens流。 例如,whitespacetokenizer遇到空白字符時分割文本。它會將文本"Quickbrownfox!"分割 為[Quick,brown,fox!]。 該tokenizer(分詞器)還負(fù)責(zé)記錄各個term(詞條)的順序或position位置(用于phrase短 語和wordproximity詞近鄰查詢),以及term(詞條)所代表的原始word(單詞)的start (起始)和end(結(jié)束)的characteroffsets(字符偏移量)(用于高亮顯示搜索的內(nèi)容)。 Elasticsearch提供了很多內(nèi)置的分詞器,可以用來構(gòu)建customanalyzers(自定義分詞器)。
1)、安裝ik分詞器
注意:不能用默認(rèn)elasticsearch-plugininstallxxx.zip進(jìn)行自動安裝 https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.4.2對應(yīng)es版本安裝
——————————————————————
進(jìn)入es容器內(nèi)部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
————————
可以確認(rèn)是否安裝好了分詞器
cd../bin
elasticsearch plugin list:即可列出系統(tǒng)的分詞器
2)、測試分詞器
使用默認(rèn)?
POST_analyze?{
????"text":?"我是中國人"
}?
請觀察結(jié)果?
——————————
使用分詞器?
POST_analyze?{
????"analyzer":?"ik_smart",
????"text":?"我是中國人"
}?
請觀察結(jié)果?
——————————————
另外一個分詞器?ik_max_word?
?POST_analyze
?{
????"analyzer":?"ik_max_word",
????"text":?"我是中國人"
}
請觀察結(jié)果?
————————————
能夠看出不同的分詞器,分詞有明顯的區(qū)別,所以以后定義一個索引不能再使用默?認(rèn)的mapping了,要手工建立mapping,因為要選擇分詞器。
3)、自定義詞庫
修改/usr/share/elasticsearch/plugins/ik/config/中的IKAnalyzer.cfg.xml /usr/share/elasticsearch/plugins/ik/config
——————————
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEpropertiesSYSTEM"http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IKAnalyzer擴展配置</comment> <!--用戶可以在這里配置自己的擴展字典--> <entrykey="ext_dict"> ????</entry> <!--用戶可以在這里配置自己的擴展停止詞字典--> ????<entrykey="ext_stopwords"></entry> <!--用戶可以在這里配置遠(yuǎn)程擴展字典--> ????<entrykey="remote_ext_dict">http://192.168.128.130/fenci/myword.txt</entry> <!--用戶可以在這里配置遠(yuǎn)程擴展停止詞字典--> <!--<entrykey="remote_ext_stopwords">words_location</entry>--> </properties>
————————
原來的xml <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEpropertiesSYSTEM"http://java.sun.com/dtd/properties.dtd"> ????????<properties> ????????<comment>IKAnalyzer擴展配置</comment> ????????<!--用戶可以在這里配置自己的擴展字典--> ????????<entrykey="ext_dict"></entry> <!--用戶可以在這里配置自己的擴展停止詞字典--> ????????<entrykey="ext_stopwords"></entry> <!--用戶可以在這里配置遠(yuǎn)程擴展字典--> <!--<entrykey="remote_ext_dict">words_location</entry>--> <!--用戶可以在這里配置遠(yuǎn)程擴展停止詞字典--> <!--<entrykey="remote_ext_stopwords">words_location</entry>--> </properties>
按照標(biāo)紅的路徑利用nginx發(fā)布靜態(tài)資源,按照請求路徑,創(chuàng)建對應(yīng)的文件夾以及文件,放在 nginx的html下
然后重啟es服務(wù)器,重啟nginx。
在kibana中測試分詞效果
更新完成后,es只會對新增的數(shù)據(jù)用新詞分詞。歷史數(shù)據(jù)是不會重新分詞的。如果想要歷 史數(shù)據(jù)重新分詞。需要執(zhí)行:
POST my_index/_update_by_query?conflicts=procee
五、Elasticsearch-Rest-Client
1)、9300:TCP?
spring-data-elasticsearch:transport-api.jar;?
????????springboot版本不同,transport-api.jar不同,不能適配es版本?
????????7.x已經(jīng)不建議使用,8以后就要廢棄
2)、9200:HTTP?
- JestClient:非官方,更新慢?
- RestTemplate:模擬發(fā)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
1、SpringBoot整合
<dependency>
????<groupId>org.elasticsearch.client</groupId>
????<artifactId>elasticsearch-rest-high-level-client</artifactId>
????<version>7.4.2</version>
?</dependency>
2、配置
@Bean
RestHighLevelClientclient(){
????RestClientBuilderbuilder=RestClient.builder(newHttpHost("192.168.56.10",
????????9200,
????????"http"));
????return?new?RestHighLevelClient(builder);
}
3、使用
@Test voidtest1()throwsIOException{ Product product=new Product(); product.setSpuName("華為"); product.setId(10L); IndexRequestrequest=new IndexRequest("product").id("20") .source("spuName","華為","id",20L); try{ IndexResponseresponse=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) { } } }
六:問題處理:
1.Es-數(shù)組的扁平化處
方案:使用nested類型?文章來源:http://www.zghlxwxcb.cn/news/detail-854494.html
視頻連接:102、全文檢索-ElasticSearch-簡介_嗶哩嗶哩_bilibili?文章來源地址http://www.zghlxwxcb.cn/news/detail-854494.html
到了這里,關(guān)于ElasticSearch-全文檢索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!