還是慣例算凿,開頭先放章節(jié)目錄份蝴,如果有幫到你的地方,歡迎點贊關(guān)注轉(zhuǎn)發(fā)氓轰,如有錯誤婚夫,歡迎指出,不勝感激
一署鸡、環(huán)境初始化
version: '3.8'
services:
cerebro:
image: lmenezes/cerebro:0.8.3
container_name: cerebro
ports:
- "9000:9000"
command:
- -Dhosts.0.host=http://eshot:9200
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:8.1.3
container_name: kibana
environment:
- I18N_LOCALE=zh-CN
- XPACK_GRAPH_ENABLED=true
- TIMELION_ENABLED=true
- XPACK_MONITORING_COLLECTION_ENABLED="true"
- ELASTICSEARCH_HOSTS=http://eshot:9200
- server.publicBaseUrl=http://192.168.160.234:5601
ports:
- "5601:5601"
networks:
- elastic
eshot:
image: elasticsearch:8.1.3
container_name: eshot
environment:
- node.name=eshot
- cluster.name=es-docker-cluster
- discovery.seed_hosts=eshot,eswarm,escold
- cluster.initial_master_nodes=eshot,eswarm,escold
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
- node.attr.node_type=hot
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data
- D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs
- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
networks:
- elastic
eswarm:
image: elasticsearch:8.1.3
container_name: eswarm
environment:
- node.name=eswarm
- cluster.name=es-docker-cluster
- discovery.seed_hosts=eshot,eswarm,escold
- cluster.initial_master_nodes=eshot,eswarm,escold
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
- node.attr.node_type=warm
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data
- D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs
- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
networks:
- elastic
escold:
image: elasticsearch:8.1.3
container_name: escold
environment:
- node.name=escold
- cluster.name=es-docker-cluster
- discovery.seed_hosts=eshot,eswarm,escold
- cluster.initial_master_nodes=eshot,eswarm,escold
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
- node.attr.node_type=cold
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data
- D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs
- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/plugins
networks:
- elastic
# volumes:
# eshotdata:
# driver: local
# eswarmdata:
# driver: local
# escolddata:
# driver: local
networks:
elastic:
driver: bridge
二请敦、測試數(shù)據(jù)添加
創(chuàng)建測試索引
PUT /zfc-doc-000001
{
"settings": {
"index":{
"number_of_shards":3,
"number_of_replicas":2
}
},
"mappings": {
"properties": {
"title":{
"type":"keyword"
},
"content":{
"type":"text"
},
"createTime":{
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"agreeNum":{
"type": "integer"
},
"comment":{
"type": "nested",
"properties": {
"content":{
"type":"text"
},
"name":{
"type":"keyword"
},
"time":{
"type":"date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
}
2.1、添加測試數(shù)據(jù)
PUT _bulk
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "1" } }
{ "title" : "Java知識點大全","content":"java 泛型储玫,基本類型有哪些","createTime": "2022-12-19","agreeNum":"99","comment":{"name":"張三","content":"學(xué)習(xí)java必備","time":"2022-12-19 09:00:00"} }
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "2" } }
{ "title" : "MySQL必知必會","content":"mysql 索引、事務(wù)萤皂、鎖","createTime": "2022-12-18","agreeNum":"500","comment":[{"name":"張三","content":"學(xué)習(xí)mysql通俗易懂","time":"2022-12-18 09:00:00"},{"name":"李四","content":"mysql 入門到精通必備的","time":"2022-12-18 10:00:00"} ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "3" } }
{ "title" : "Redis運維實戰(zhàn)","content":"redis的rdb與aof","createTime": "2022-12-18","agreeNum":"300","comment":[{"name":"小紅","content":"redis的備份","time":"2022-12-18 09:00:00"},{"name":"李四","content": "redis 入門","time":"2022-12-18 15:00:00"} ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "4" } }
{ "title" : "Elasticsearch","content":"ES crud","createTime": "2022-12-17","agreeNum":"300","comment":[{"name":"小紅","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四","content": "es 入門","time":"2022-12-18 16:00:00"} ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "5" } }
{ "title" : "常見MQ知識點匯總","content":"rabbitmq kafka rockmq activemq","createTime": "2022-12-16","agreeNum":"260","comment":[{"name":"小紅","content":"kafka的基礎(chǔ)概念","time":"2022-12-18 09:00:00"},{"name":"李四","content": "事務(wù)消息","time":"2022-12-18 15:00:00"} ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "6" } }
{ "title" : "ES奇淫技巧","content":"玩轉(zhuǎn)es","createTime": "2022-12-18","agreeNum":"600","comment":[{"name":"小紅1號","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四1號","content": "es 入門","time":"2022-12-18 16:00:00"} ]}
{ "index" : { "_index" : "zfc-doc-000001", "_id" : "7" } }
{ "title" : "ES","content":"真的666","createTime": "2022-12-17","agreeNum":"300","comment":[{"name":"小紅1號","content":"es的基礎(chǔ)SQL語法","time":"2022-12-17 09:00:00"},{"name":"李四1號","content": "es 入門","time":"2022-12-18 16:00:00"} ]}
三撒穷、標(biāo)準(zhǔn)查詢語句使用
根據(jù)一個字段進(jìn)行檢索,假如我們要搜索content
包含ES
的文檔裆熙,我們的查詢語句可以這樣寫
GET zfc-doc-000001/_search
{
"query": {
"match":{
"content":"ES"
}
}
}
上面這個語句的意思簡單理解就是查詢content
字段中包含ES
的文檔端礼。在深一層次來看禽笑,首先查看content
字段的類型,通過查看上面的創(chuàng)建索引語句可以知道蛤奥,content
字段定義的是text
類型佳镜,所以Elasticsearch
會對content
字段進(jìn)行分詞檢索,返回文檔中出現(xiàn)es
的凡桥,除了上面這種寫法外還可以使用如下幾種方式進(jìn)行檢索
# 分詞匹配es或者crud的文檔
GET zfc-doc-000001/_search
{
"query": {
"match":{
"content":"ES crud"
}
}
}
# 短語查詢分詞es
GET zfc-doc-000001/_search
{
"query": {
"match_phrase":{
"content":"es"
}
}
}
# 前綴檢索分詞es
GET zfc-doc-000001/_search
{
"query": {
"prefix":{
"content":"es"
}
}
}
# 模糊匹配分詞es
GET zfc-doc-000001/_search
{
"query": {
"fuzzy":{
"content":"es*"
}
}
}
為了查詢結(jié)果的更精確蟀伸,增加title
字段為ES
的約束條件,需要注意大小寫缅刽,因為title
字段類型為keyword
啊掏,不區(qū)分大小寫的,所以查詢語句可以這樣寫
該語句返回content
字段中分詞匹配詞語ES(不區(qū)分大小寫)
的文檔或者title
字段精確匹配ES
的文檔
GET zfc-doc-000001/_search
{
"query": {
"multi_match": {
"query": "ES",
"fields":["content","title"]
}
}
}
一個簡單的檢索語句通過上述幾種方式即可實現(xiàn)了衰猛,但是實際工作中迟蜜,肯定還是用到分詞器的,下面就以常用的IK分詞器
進(jìn)行說明
3.1啡省、查詢時指定分詞器
首先是第一種查詢時指定分詞器的形式進(jìn)行檢索
GET /zfc-doc-000001/_search
{
"query": {
"match": {
"content": {
"query": "es",
"analyzer": "ik_max_word"
}
}
}
}
通過上面指定分詞器的形式娜睛,我們在查詢時就可以使用ik_max_word
來作為檢索分詞來處理了,我們也可以在創(chuàng)建索引時增加字段分詞的配置卦睹,方便檢索時默認(rèn)使用指定分詞器檢索畦戒,下面就是創(chuàng)建索引指定分詞器的步驟
3.2、初始化默認(rèn)分詞器
1分预、刪除剛才創(chuàng)建的索引
DELETE zfc-doc-000001
2兢交、修改content
字段,加入分詞器ik_max_word
笼痹,修改部分如下
"content":{
"type":"text",
"analyzer": "ik_max_word"
}
完整的語句如下所示
PUT /zfc-doc-000001
{
"settings": {
"index":{
"number_of_shards":3,
"number_of_replicas":2
}
},
"mappings": {
"properties": {
"title":{
"type":"keyword"
},
"content":{
"type":"text",
"analyzer": "ik_max_word"
},
"createTime":{
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"agreeNum":{
"type": "integer"
},
"comment":{
"type": "nested",
"properties": {
"content":{
"type":"text"
},
"name":{
"type":"keyword"
},
"time":{
"type":"date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
}
通過上面語句創(chuàng)建完索引之后配喳,content
字段就是使用ik_max_word
分詞的了,這樣使用普通的match
查詢即可凳干,這里也就不再演示了
GET zfc-doc-000001/_search
{
"query": {
"match":{
"content":"es"
}
}
}
四晴裹、查詢的進(jìn)階使用
4.1、分頁查詢
我們可以使用from
和size
參數(shù)配置使用救赐,其中from
為要跳過的文檔數(shù)量涧团,size
為要返回的文檔數(shù)量
在全部文檔中,過濾前兩個文件经磅,從第3個文檔開始泌绣,返回10個文檔
GET zfc-doc-000001/_search
{
"query": {
"match_all": {
}
},
"size": 10,
"from": 2
}
4.2、范圍查詢
對于范圍查詢预厌,我們可以使用range
查詢阿迈,最簡單的參數(shù)就是gte
與lte
GET zfc-doc-000001/_search
{
"query": {
"range": {
"agreeNum": {
"gte": 100,
"lte": 300
}
}
}
}
4.3、聚合
聚合語法的使用就是對一個文檔中某個字段的統(tǒng)計轧叽,類似與關(guān)系型數(shù)據(jù)庫中的先group
在count
一個字段的值苗沧,具體使用如下刊棕,如果我們不想返回都是哪些數(shù)據(jù)參與了聚合,還可以加入?yún)?shù)"size":0
待逞,如下語句中甥角,其中my_aggs
是自定義聚合的名稱,terms
是聚合的類型识樱,field
是要對哪個字段進(jìn)行聚合嗤无,需要注意的是text
類型是無法使用聚合的,terms
下面的"size":10
是指如果聚合桶的數(shù)量超過10的話只取前10個
GET zfc-doc-000001/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"my_aggs": {
"terms": {
"field": "title",
"size": 10
}
}
}
}
Elasticsearch
支持多種聚合類型牺荠,每種類型都有不同的功能和用途翁巍。以下是一些常用的聚合類型及其含義:
Terms Aggregation(詞條聚合):根據(jù)指定字段的值進(jìn)行分組,并計算每個分組的文檔數(shù)量休雌≡詈可以用于統(tǒng)計某個字段的分布情況。
Range Aggregation(范圍聚合):將指定字段的值劃分為不同的范圍杈曲,并計算每個范圍內(nèi)的文檔數(shù)量驰凛。可用于分析數(shù)值型字段的分布情況担扑。
Date Histogram Aggregation(日期直方圖聚合):根據(jù)指定日期字段的值進(jìn)行分組恰响,并按照時間間隔(如按月、按周)計算每個時間段內(nèi)的文檔數(shù)量涌献。
Histogram Aggregation(直方圖聚合):根據(jù)指定字段的值進(jìn)行分組胚宦,并按照指定的間隔計算每個分組的文檔數(shù)量。適用于分析數(shù)值型字段的分布情況燕垃。
Average Aggregation(平均值聚合):計算指定字段的平均值枢劝。
Sum Aggregation(求和聚合):計算指定字段的總和。
Min Aggregation(最小值聚合):計算指定字段的最小值卜壕。
Max Aggregation(最大值聚合):計算指定字段的最大值您旁。
Cardinality Aggregation(基數(shù)聚合):計算指定字段的唯一值的數(shù)量。
Stats Aggregation(統(tǒng)計聚合):計算指定字段的統(tǒng)計信息轴捎,包括最小值鹤盒、最大值、平均值侦副、總和和文檔數(shù)量侦锯。
這只是一小部分聚合類型的示例,Elasticsearch
還提供了其他類型的聚合秦驯,如Percentiles Aggregation
(百分位數(shù)聚合)率触、Extended Stats Aggregation
(擴展統(tǒng)計聚合)等。你可以根據(jù)你的具體需求選擇適合的聚合類型,并結(jié)合查詢條件和其他聚合層級來進(jìn)行復(fù)雜的數(shù)據(jù)分析和統(tǒng)計葱蝗。
如果你看到這了,歡迎點個關(guān)注细燎、后續(xù)推文深度只會越來越深两曼,期待你的關(guān)注,讓我們共同進(jìn)步
elasticsearch
還支持嵌套聚合玻驻,只需要在aggs
里面在寫一個aggs
即可悼凑,可以參考如下寫法,對該示例不符合璧瞬,僅供參考
GET /zfc-doc-000001/_search
{
"size": 0,
"aggs": {
"my_aggs1": {
"terms": {
"field": "field1"
},
"aggs": {
"my_aggs2": {
"terms": {
"field": "field2"
},
"aggs": {
"avg_value": {
"avg": {
"field": "numeric_field"
}
}
}
}
}
}
}
}
4.4户辫、高亮結(jié)果
如果我們想在返回結(jié)果中對命中的關(guān)鍵詞進(jìn)行高亮顯示可以使用如下語句
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "ES"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
默認(rèn)是在返回結(jié)果中加入em
標(biāo)簽,如果我們想自定義標(biāo)簽可以使用如下語句嗤锉,如下示例是改為了strong
標(biāo)簽
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "es"
}
},
"highlight": {
"pre_tags": ["<strong>"],
"post_tags": ["</strong>"],
"fields": {
"content": {}
}
}
}
五渔欢、修改算分提升匹配度
5.1、function_score
假設(shè)我們的原始查詢語句如下
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "es"
}
}
}
返回結(jié)果如下瘟忱,ID為6的排在了第一位
如果我們想讓ID為4的排在第一位如何修改查詢語句呢奥额,那么我們可以使用function_score
來增加權(quán)重算分,比如使用title
中匹配Elasticsearch
的
此處是為舉例访诱,要學(xué)習(xí)思想垫挨,以后工作中才有更好的思路
修改之后的查詢語句如下
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"functions": [
{
"filter": {
"term": {
"title": "Elasticsearch"
}
},
"weight":2
}
],
"score_mode": "multiply",
"boost_mode": "multiply"
}
}
}
可以看到,顯示結(jié)果已經(jīng)發(fā)生改變触菜,ID為4的算分已經(jīng)高于ID為6的算分了
其中九榔,query
參數(shù)用于指定正常的查詢語句,functions
參數(shù)用于定義一個或多個函數(shù)來修改文檔得分
score_mode
和boost_mode
是用于控制function_score
查詢中如何計算文檔得分和如何影響文檔的排名的參數(shù)涡相。
-
score_mode
:參數(shù)用于指定多個函數(shù)如何組合計算得分哲泊。它支持以下取值:-
multiply
: 將所有函數(shù)的得分相乘 -
sum
: 將所有函數(shù)的得分相加 -
avg
: 將所有函數(shù)的得分求平均值 -
max
: 取所有函數(shù)的最大得分作為文檔得分 -
min
: 取所有函數(shù)的最小得分作為文檔得分 -
first
: 取第一個函數(shù)的得分作為文檔得分 -
weighted_sum
: 將所有函數(shù)的得分相加,并乘以給定的權(quán)重系數(shù)漾峡。
-
-
boost_mode
參數(shù)用于指定得分如何影響文檔的排名攻旦。它支持以下取值:-
multiply
: 將得分與文檔的原始得分相乘 -
replace
: 使用得分替換文檔的原始得分 -
sum
: 將得分與文檔的原始得分相加 -
avg
: 將得分與文檔的原始得分求平均值 -
max
: 取得分和文檔的原始得分的最大值作為文檔得分 -
min
: 取得分和文檔的原始得分的最小值作為文檔得分
-
請注意,score_mode
和boost_mode
參數(shù)的取值會影響文檔得分和排名的計算方式生逸,需要根據(jù)具體的需求來選擇合適的取值牢屋。另外,function_score
查詢中可以定義多個函數(shù)來修改文檔得分槽袄,也可以使用weight
函數(shù)來給定固定的分值烙无,這些函數(shù)的組合和參數(shù)設(shè)置可能會對結(jié)果產(chǎn)生重要影響。
除了使用上述方式外遍尺,還可以使用如下幾種方式進(jìn)行算分的修改
5.2截酷、Boosting
如下是匹配content
字段中包含es
的,對content
中包含es
的進(jìn)行減分
GET zfc-doc-000001/_search
{
"query": {
"boosting": {
"positive": {
"term": {
"content": "es"
}
},
"negative": {
"term": {
"content": "玩轉(zhuǎn)"
}
},
"negative_boost": 0.5
}
}
}
5.3乾戏、Field Value Factor
需要注意的是迂苛,
field_value_factor
函數(shù)用于根據(jù)字段的數(shù)值進(jìn)行打分計算三热,要求字段是數(shù)值類型的。
我們使用Field Value Factor
來根據(jù)字段agreeNum
的值對包含ES
關(guān)鍵詞的文檔進(jìn)行加權(quán)三幻。使用log1p
修飾符可以將字段值的對數(shù)應(yīng)用于計算
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "ES"
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "ES"
}
},
"field_value_factor": {
"field": "agreeNum",
"factor": 0.1,
"modifier": "log1p"
}
}
},
"sort": [
{
"_score": {
"order": "asc"
}
}
]
}
其中field_value_factor
的參數(shù)含義如下
-
field
: 要計算得分的字段名 -
factor
: 一個乘數(shù)就漾,用于縮放字段值的影響∧畎幔可以使用任何非負(fù)數(shù)值抑堡。假如factor
的值是0.1,表示字段值的影響將會被減小 -
modifier
: 一個修飾符朗徊,用于對數(shù)值進(jìn)行修改以調(diào)整得分-
none
:不應(yīng)用任何修飾符首妖,默認(rèn)情況下為1 -
log
:對計算結(jié)果取對數(shù),以減少較大值的影響 -
log1p
:與log
類似爷恳,但在計算結(jié)果前先加1有缆,可以避免對0值進(jìn)行對數(shù)運算
-
5.4、Script Score
我們可以使用script_score
來自定義計算得分舌仍,此處僅為示例妒貌,具體可以根據(jù)自己的業(yè)務(wù)來修改。具體計算分可以通過explain
來查看驗證
GET zfc-doc-000001/_search
{
"explain": true,
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"script_score": {
"script": {
"source": "Math.log(doc['agreeNum'].value + 10)"
}
}
}
}
}
5.5铸豁、Decay Functions
我們使用Gauss衰減函數(shù)根據(jù)字段createTime
的值來衰減文檔的得分灌曙。在這個例子中,以2022-12-01
為中心节芥,每過10
天在刺,得分將衰減一半。參考結(jié)果可以使用下面兩個查詢語句對應(yīng)
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "es"
}
}
}
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"functions": [
{
"gauss": {
"createTime": {
"origin": "2022-12-01",
"scale": "10d"
}
}
}
]
}
}
}
六头镊、Filter
Filter
和Query
是Elasticsearch
中用于檢索和過濾數(shù)據(jù)的兩種不同方式蚣驼,它們各自有一些優(yōu)缺點
Filter的優(yōu)點:
- 性能更高:Filter對結(jié)果進(jìn)行緩存,可以重復(fù)使用緩存結(jié)果相艇,提高查詢的性能颖杏。當(dāng)使用相同的過濾條件進(jìn)行多次查詢時,F(xiàn)ilter可以避免重復(fù)計算
- 精確性更高:Filter對結(jié)果進(jìn)行精確匹配坛芽,只返回滿足過濾條件的文檔留储,不計算相關(guān)性得分。這使得Filter非常適用于那些不需要考慮相關(guān)性的精確匹配查詢
- 可緩存性:Filter的結(jié)果可以被緩存咙轩,可以在后續(xù)的查詢中重復(fù)使用获讳。如果數(shù)據(jù)沒有變化,那么緩存的結(jié)果可以直接返回活喊,減少了計算的開銷
Filter的缺點:
- 無法計算相關(guān)性得分:Filter不計算相關(guān)性得分丐膝,因此無法進(jìn)行排序或評分。如果需要根據(jù)文檔的相關(guān)性進(jìn)行排序或評分,就需要使用Query
- 不支持全文搜索:Filter只能進(jìn)行精確匹配帅矗,無法進(jìn)行全文搜索偎肃。如果需要進(jìn)行全文搜索,就需要使用Query
Query的優(yōu)點:
- 支持全文搜索:Query可以進(jìn)行全文搜索损晤,可以對文本進(jìn)行分詞和相關(guān)性評分软棺,返回與查詢條件最匹配的文檔
- 支持排序和評分:Query可以根據(jù)文檔的相關(guān)性得分進(jìn)行排序和評分,使得搜索結(jié)果更具有相關(guān)性
- 靈活性更高:Query提供了更多的查詢選項和查詢語法尤勋,可以進(jìn)行復(fù)雜的查詢操作,包括布爾邏輯茵宪、范圍查詢最冰、模糊查詢等
Query的缺點:
- 性能相對較低:Query需要計算相關(guān)性得分,并對所有文檔進(jìn)行評分和排序稀火,因此相對于Filter而言暖哨,性能較低
- 無法緩存結(jié)果:由于Query計算的是相關(guān)性得分,結(jié)果會隨著數(shù)據(jù)的變化而變化凰狞,無法進(jìn)行緩存和重復(fù)使用
綜上所述篇裁,F(xiàn)ilter適用于需要精確匹配和高性能的查詢場景,而Query適用于需要全文搜索赡若、排序和評分的場景达布。根據(jù)具體的需求和性能要求,選擇合適的過濾方式可以提高查詢的效率和準(zhǔn)確性
補充
Elasticsearch
的查詢DSL
語句中有很多常用的參數(shù)逾冬,用于指定查詢的條件和行為黍聂。以下是一些常用的查詢:
-
match
: 使用match
查詢參數(shù)可以執(zhí)行全文本搜索,它會將查詢字符串分析為詞項并與文檔進(jìn)行匹配 -
term
:term
查詢參數(shù)用于精確匹配某個字段的值身腻,不進(jìn)行分析 -
bool
:bool
查詢參數(shù)用于組合多個查詢條件产还,如must
(與操作)、should
(或操作)嘀趟、must_not
(非操作) -
range
:range
查詢參數(shù)用于匹配指定范圍內(nèi)的值脐区,可以用于數(shù)值、日期等類型的字段 -
exists
:exists
查詢參數(shù)用于匹配包含指定字段的文檔 -
prefix
:prefix
查詢參數(shù)用于匹配以指定前綴開頭的字段值 -
wildcard
:wildcard
查詢參數(shù)用于支持通配符匹配她按,如使用*
和?
進(jìn)行模糊匹配 -
fuzzy
:fuzzy
查詢參數(shù)用于執(zhí)行模糊匹配牛隅,可以處理拼寫錯誤或相似度較高的查詢字符串 -
match_phrase
:match_phrase
查詢參數(shù)用于匹配包含指定短語的文檔 -
multi_match
:multi_match
查詢參數(shù)用于在多個字段中執(zhí)行全文本搜索 -
terms
:terms
查詢是一種多詞項查詢,用于查找包含給定詞項中任何一個的文檔 -
match_phrase_prefix
:match_phrase_prefix
查找包含指定短語前綴的文檔尤溜。它可以通過指定一個短語前綴和一個最大擴展長度來實現(xiàn) -
regexp
:regexp
是使用正則表達(dá)式匹配文檔的倔叼,能夠在文本字段中匹配符合正則表達(dá)式的文本,從而檢索文檔