Elasticsearch算分優(yōu)化方案之rescore_query示例詳解
簡介
今天來說一說Elasticsearch 的重新評分,即在檢索出來一次結果的基礎上在進行檢索提升數據排序效果,但是僅對查詢或者post_filter階段返回的前多少條進行二次查詢。在每個分片上進行二次檢索的文檔數量時可以通過window_size 控制的,該參數默認10。
默認情況下,原來的查詢語句與二次查詢的份數將線性組合以生成文檔的最終得分_score,原始查詢語句的權重通過query_weight控制,重新二次查詢的權重通過rescore_query_weight控制,他們默認都是1。
在Elasticsearch中,rescore_query是一種用于改進搜索結果排序的查詢。它可以在原始查詢結果的基礎上重新計算得分,并重新排序搜索結果。
rescore_query通常用于在搜索過程的后期階段對搜索結果進行優(yōu)化。它可以根據特定的需求和業(yè)務規(guī)則,對原始查詢結果進行二次排序,以提高最相關的文檔的排名。
rescore_query可以在分布式搜索中非常有用,因為它僅在原始查詢的結果上執(zhí)行計算,而不需要重新執(zhí)行整個查詢過程。這可以提高搜索速度并減輕系統(tǒng)負載。
通過使用rescore_query,可以根據不同的評分算法、過濾器或其他上下文信息,對搜索結果進行個性化的定制排序。它可以根據文檔的屬性、時間戳、地理位置等進行排序,以獲得更加準確和有用的搜索結果。
總而言之,rescore_query是一種用于改進搜索結果排序的查詢,可以根據不同的規(guī)則和需求重新計算得分并重新排序搜索結果,以提高搜索準確性和實用性。
實戰(zhàn)
搭建ES環(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創(chuàng)建索引
PUT /zfc-doc-000006
{
"mappings": {
"properties": {
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}添加測試數據
PUT _bulk
{"index":{"_index":"zfc-doc-000006","_id":"1"}}
{"title":"ES實戰(zhàn)","content":"ES的實戰(zhàn)操作,實戰(zhàn)要領,實戰(zhàn)經驗"}
{"index":{"_index":"zfc-doc-000006","_id":"2"}}
{"title":"MySQL實戰(zhàn)","content":"MySQL的實戰(zhàn)操作"}
{"index":{"_index":"zfc-doc-000006","_id":"3"}}
{"title":"MySQL","content":"MySQL一定要會"}檢索驗證
首先我們還是正常檢索一下content字段中包含實戰(zhàn)的文檔
GET zfc-doc-000006/_search
{
"query": {
"match": {
"content": "實戰(zhàn)"
}
}
}按照我們的預期,因為文檔1中包含實戰(zhàn)有3次出現,所以title為ES實戰(zhàn)的排名靠前,可以看到文檔1的算分為0.6,位列第一,輸出結果如下
"max_score" : 0.667102,
"hits" : [
{
"_index" : "zfc-doc-000006",
"_id" : "1",
"_score" : 0.667102,
"_source" : {
"title" : "ES實戰(zhàn)",
"content" : "ES的實戰(zhàn)操作,實戰(zhàn)要領,實戰(zhàn)經驗"
}
},
{
"_index" : "zfc-doc-000006",
"_id" : "2",
"_score" : 0.5442147,
"_source" : {
"title" : "MySQL實戰(zhàn)",
"content" : "MySQL的實戰(zhàn)操作"
}
}
]然后對檢索出來的實戰(zhàn)的文檔中,進行重新算分排序,包含MySQL的排名在前,增加算分
GET zfc-doc-000006/_search
{
"query": {
"match": {
"content": "實戰(zhàn)"
}
},
"rescore": {
"query": {
"rescore_query":{
"match":{
"title":"MySQL"
}
},
"query_weight" : 0.7,
"rescore_query_weight" : 1.2
},
"window_size": 50
}
}上述查詢語句的意思就是查詢content字段中包含”實戰(zhàn)“的文檔,權重為0.7。并對文檔中title為MySQL的文檔增加評分,權重為1.2,window_size為50,表示取分片結果的前50進行重新算分
響應結果如下,可以看到title為MySQL實戰(zhàn)的評分已經變?yōu)?code>0.9,遠遠的超過了title為ES實戰(zhàn)的文檔
"hits" : [
{
"_index" : "zfc-doc-000006",
"_id" : "2",
"_score" : 0.9022989,
"_source" : {
"title" : "MySQL實戰(zhàn)",
"content" : "MySQL的實戰(zhàn)操作"
}
},
{
"_index" : "zfc-doc-000006",
"_id" : "1",
"_score" : 0.46697137,
"_source" : {
"title" : "ES實戰(zhàn)",
"content" : "ES的實戰(zhàn)操作,實戰(zhàn)要領,實戰(zhàn)經驗"
}
}
]總結
通過rescore_query我們可以對檢索結果進行二次評分,增加自己更復雜的評分邏輯,提供更準確的結果排序,但是相應的也會增加查詢的計算成本與響應時間。
在《一篇文章讓你學會Elasticsearch中的查詢》一文中,我們學習了修改算分的幾種方式,本文學習了如何在檢索結果返回之后對檢索結果進行更精細的二次評分排序。后面推出一篇專門修改算分的文章,以此來實現工作中的修改算分的需求。
以上就是Elasticsearch算分優(yōu)化方案之rescore_query示例詳解的詳細內容,更多關于Elasticsearch算分rescore_query的資料請關注腳本之家其它相關文章!
相關文章
Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一
對比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?很多朋友對這一問題不是很清楚,今天小編給大家?guī)硪黄坛剃P于Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一,一起看看吧2021-08-08
spring data jpa 創(chuàng)建方法名進行簡單查詢方式
這篇文章主要介紹了spring data jpa 創(chuàng)建方法名進行簡單查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot集成WebSocket的兩種方式(JDK內置版和Spring封裝版)
這篇文章主要介紹了SpringBoot集成WebSocket的兩種方式,這兩種方式為JDK內置版和Spring封裝版,本文結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-06-06

