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