国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ElasticSearch-全文檢索

這篇具有很好參考價值的文章主要介紹了ElasticSearch-全文檢索。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介

https://www.elastic.co/cn/what-is/elasticsearch

全文搜索屬于最常見的需求,開源的Elasticsearch是目前全文搜索引擎的首選。 它可以快速地儲存、搜索和分析海量數(shù)據(jù)。

維基百科、StackOverflow、Github都采用它。

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

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)容;

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

4、倒排索引機制

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

-- 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

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

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 BYSQL聚合函數(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)、字段類型

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

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

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)

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ù)組的扁平化處

ElasticSearch-全文檢索,全文檢索,elasticsearch,大數(shù)據(jù)方案:使用nested類型?

視頻連接: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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ES(Elasticsearch 全文檢索)

    ES(Elasticsearch 全文檢索)

    數(shù)據(jù)量大的時候 索引失效 =查詢性能低 功能比較弱 對文檔的內(nèi)容進(jìn)行分詞,對詞條創(chuàng)建索引,記錄詞條所在的文檔信息根據(jù)詞條查詢到文檔的id 從而查到文檔 文檔:每一條數(shù)據(jù)就是一條文檔 詞條:文檔按照語義分成的詞語 正向索引 根據(jù)文檔的id創(chuàng)建索引 查詢詞條必須先找

    2024年02月05日
    瀏覽(52)
  • 九.全文檢索ElasticSearch經(jīng)典入門-ElasticSearch映射修改

    九.全文檢索ElasticSearch經(jīng)典入門-ElasticSearch映射修改

    這篇文章的內(nèi)容是ElasticSearch映射修改,寫這篇文章是有水友公司里面遇到了映射修改問題,我這里做了一個整理,希望對你有所幫助。 在ElasticSearch中一旦創(chuàng)建了映射想要進(jìn)行修改是不被允許的。比如我這里有一個案例 上面創(chuàng)建了索引employee ,同時為其創(chuàng)建映射,指定了id和

    2024年02月05日
    瀏覽(31)
  • 全文檢索-Elasticsearch-整合SpringBoot

    全文檢索-Elasticsearch-整合SpringBoot

    前面記錄了 Elasticsearch 全文檢索的入門篇和進(jìn)階檢索。這次我們來講下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服務(wù)項目中使用 ES 來實現(xiàn)全文檢索,來達(dá)到商品檢索的功能。 檢索服務(wù)單獨作為一個服務(wù),就稱作 gulimall-search 模塊。 點擊 Next 勾選 Spring Web 依賴,點擊

    2024年02月08日
    瀏覽(18)
  • ElasticSearch全文檢索原理及過程

    ElasticSearch全文檢索原理及過程

    ????????ElasticSearch的搜索引擎中,每個 文檔都有一個對應(yīng)的文檔 ID ,文檔內(nèi)容被表示為一系列的集合。例如文檔 1 經(jīng)過分詞,提取了 20 個, 每個都會記錄它在文檔中出現(xiàn)的次數(shù)和出現(xiàn)位置 。那么,倒排索引就是 到文檔 ? ID 的映射 ,每個關(guān)鍵

    2023年04月17日
    瀏覽(25)
  • 7-Elasticsearch組合查詢和全文檢索

    Elasticsearch組合查詢 組合查詢–布爾查詢 組合查詢中的常用的查詢方式:布爾查詢。 它將多個查詢條件組合在一起,并且將查詢的結(jié)果和結(jié)果的評分組合在一起。 布爾查詢是把多個子查詢組合成一個布爾表達(dá)式,所有子查詢之間邏輯關(guān)系是and,只有當(dāng)一個文檔滿足布爾查詢

    2024年02月04日
    瀏覽(24)
  • 全文檢索學(xué)習(xí)之ElasticSearch學(xué)習(xí)筆記

    在非關(guān)系型數(shù)據(jù)庫中,數(shù)據(jù)是非結(jié)構(gòu)化的,如果直接去查找效率極低,全文檢索將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來,重新組織,使其變得有一定結(jié)構(gòu),然后對此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索,從而達(dá)到搜索相對較快的目的。索引就是從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組

    2023年04月11日
    瀏覽(20)
  • ElasticSearch:全文檢索及倒排索引原理

    ElasticSearch:全文檢索及倒排索引原理

    首先介紹一下結(jié)構(gòu)化與非結(jié)構(gòu)化數(shù)據(jù): 結(jié)構(gòu)化數(shù)據(jù)將數(shù)據(jù)具有的特征事先以結(jié)構(gòu)化的形式定義好,數(shù)據(jù)有固定的格式或有限的長度。典型的結(jié)構(gòu)化數(shù)據(jù)就是傳統(tǒng)關(guān)系型數(shù)據(jù)庫的表結(jié)構(gòu),數(shù)據(jù)特征直接體現(xiàn)在表結(jié)構(gòu)的字段上,所以根據(jù)某一特征做數(shù)據(jù)檢索很直接,速度也比較快

    2024年02月14日
    瀏覽(22)
  • 全文檢索工具elasticsearch:第一章:理論知識

    全文檢索工具elasticsearch:第一章:理論知識

    cluster 整個elasticsearch 默認(rèn)就是集群狀態(tài),整個集群是一份完整、互備的數(shù)據(jù)。 node 集群中的一個節(jié)點,一般只一個進(jìn)程就是一個node shard 分片,即使是一個節(jié)點中的數(shù)據(jù)也會通過hash算法,分成多個片存放,默認(rèn)是5片。 index 相當(dāng)于rdbms的database, 對于用戶來說是一個邏輯數(shù)據(jù)庫

    2024年04月16日
    瀏覽(28)
  • Mysql 實現(xiàn)類似于 ElasticSearch 的全文檢索功能

    ? 一、前言 今天一個同事問我,如何使用 Mysql 實現(xiàn)類似于 ElasticSearch 的全文檢索功能,并且對檢索跑分?我當(dāng)時腦子里立馬產(chǎn)生了疑問?為啥不直接用es呢?簡單好用還賊快。但是聽他說,數(shù)據(jù)量不多,客戶給的時間非常有限,根本沒時間去搭建es,所以還是看一下

    2024年02月03日
    瀏覽(16)
  • SpringBoot封裝Elasticsearch搜索引擎實現(xiàn)全文檢索

    注:本文實現(xiàn)了Java對Elasticseach的分頁檢索/不分頁檢索的封裝 ES就不用過多介紹了,直接上代碼: 創(chuàng)建Store類(與ES字段對應(yīng),用于接收ES數(shù)據(jù)) Elasticsearch全文檢索接口:不分頁檢索 Elasticsearch全文檢索接口:分頁檢索 本文實現(xiàn)了Java對Elasticsearch搜索引擎全文檢索的封裝 傳入

    2024年02月04日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包