Elasticsearch算分优化方案之rescore_query

这篇具有很好参考价值的文章主要介绍了Elasticsearch算分优化方案之rescore_query。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

今天来说一说Elasticsearch 的重新评分,即在检索出来一次结果的基础上在进行检索提升数据排序效果,但是仅对查询或者post_filter阶段返回的前多少条进行二次查询。在每个分片上进行二次检索的文档数量时可以通过window_size 控制的,该参数默认10

默认情况下,原来的查询语句与二次查询的份数将线性组合以生成文档的最终得分_score,原始查询语句的权重通过query_weight控制,重新二次查询的权重通过rescore_query_weight控制,他们默认都是1

在Elasticsearch中,rescore_query是一种用于改进搜索结果排序的查询。它可以在原始查询结果的基础上重新计算得分,并重新排序搜索结果。

rescore_query通常用于在搜索过程的后期阶段对搜索结果进行优化。它可以根据特定的需求和业务规则,对原始查询结果进行二次排序,以提高最相关的文档的排名。

rescore_query可以在分布式搜索中非常有用,因为它仅在原始查询的结果上执行计算,而不需要重新执行整个查询过程。这可以提高搜索速度并减轻系统负载。

通过使用rescore_query,可以根据不同的评分算法、过滤器或其他上下文信息,对搜索结果进行个性化的定制排序。它可以根据文档的属性、时间戳、地理位置等进行排序,以获得更加准确和有用的搜索结果。

总而言之,rescore_query是一种用于改进搜索结果排序的查询,可以根据不同的规则和需求重新计算得分并重新排序搜索结果,以提高搜索准确性和实用性。

实战

搭建ES环境

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

创建索引

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实战","content":"ES的实战操作,实战要领,实战经验"}
{"index":{"_index":"zfc-doc-000006","_id":"2"}}
{"title":"MySQL实战","content":"MySQL的实战操作"}
{"index":{"_index":"zfc-doc-000006","_id":"3"}}
{"title":"MySQL","content":"MySQL一定要会"}

检索验证

  • 首先我们还是正常检索一下content字段中包含实战的文档

    GET zfc-doc-000006/_search
    {
      "query": {
        "match": {
          "content": "实战"
        }
      }
    }
    

    按照我们的预期,因为文档1中包含实战3次出现,所以titleES实战的排名靠前,可以看到文档1的算分为0.6,位列第一,输出结果如下

        "max_score" : 0.667102,
        "hits" : [
          {
            "_index" : "zfc-doc-000006",
            "_id" : "1",
            "_score" : 0.667102,
            "_source" : {
              "title" : "ES实战",
              "content" : "ES的实战操作,实战要领,实战经验"
            }
          },
          {
            "_index" : "zfc-doc-000006",
            "_id" : "2",
            "_score" : 0.5442147,
            "_source" : {
              "title" : "MySQL实战",
              "content" : "MySQL的实战操作"
            }
          }
        ]
    
  • 然后对检索出来的实战的文档中,进行重新算分排序,包含MySQL的排名在前,增加算分

    GET zfc-doc-000006/_search
    {
      "query": {
        "match": {
          "content": "实战"
        }
      },
      "rescore": {
        "query": {
          "rescore_query":{
            "match":{
              "title":"MySQL"
            }
          },
          "query_weight" : 0.7,
          "rescore_query_weight" : 1.2
        },
        "window_size": 50
      }
    }
    

    上述查询语句的意思就是查询content字段中包含”实战“的文档,权重为0.7。并对文档中titleMySQL的文档增加评分,权重为1.2window_size50,表示取分片结果的前50进行重新算分

    响应结果如下,可以看到titleMySQL实战的评分已经变为0.9,远远的超过了titleES实战的文档

        "hits" : [
          {
            "_index" : "zfc-doc-000006",
            "_id" : "2",
            "_score" : 0.9022989,
            "_source" : {
              "title" : "MySQL实战",
              "content" : "MySQL的实战操作"
            }
          },
          {
            "_index" : "zfc-doc-000006",
            "_id" : "1",
            "_score" : 0.46697137,
            "_source" : {
              "title" : "ES实战",
              "content" : "ES的实战操作,实战要领,实战经验"
            }
          }
        ]
    

总结

通过rescore_query我们可以对检索结果进行二次评分,增加自己更复杂的评分逻辑,提供更准确的结果排序,但是相应的也会增加查询的计算成本与响应时间。

在《一篇文章让你学会Elasticsearch中的查询》一文中,我们学习了修改算分的几种方式,本文学习了如何在检索结果返回之后对检索结果进行更精细的二次评分排序。后面推出一篇专门修改算分的文章,以此来实现工作中的修改算分的需求。

如果感觉本文对你有所帮助欢迎点赞评论转发收藏。如果你想了解更多关于ES的骚操作,更多实战经验,欢迎关注。
Elasticsearch算分优化方案之rescore_query,后端

原文链接:
https://mp.weixin.qq.com/s?__biz=MzIwNzYzODIxMw==&mid=2247486054&idx=1&sn=ec8e8a51722bf16557daf3929b42fd2a&chksm=970e11cca07998da1dc8e0f6b88d2c85499c09770867afb41f2eb5c66fdb202bddcbe59e0382#rd文章来源地址https://www.toymoban.com/news/detail-665382.html

到了这里,关于Elasticsearch算分优化方案之rescore_query的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch集群优化

    版本配置: ES版本:7.16.1 OS内存64G。 1、磁盘选择 Elasticsearch重度使用磁盘,磁盘的效率越高,Elasticsearch的执行效率就越高。 优化磁盘: 1)使用SSD(固态硬盘)。 2)使用RAID0模式,即将连续的数据分散到多个硬盘存储,这样可以并行进行IO操作。代价是一块硬盘发生故障就

    2024年02月05日
    浏览(42)
  • Elasticsearch中查询性能优化

    Elasticsearch 是一种流行的搜索引擎和分布式文档存储解决方案,它的高效性能和可伸缩性使其成为许多应用程序的首选存储引擎。在工作中,优化 Elasticsearch 的检索性能是一个非常重要的任务,可以大大提高应用程序的响应速度和用户体验。下面我们将讨论如何优化 Elasticse

    2024年02月16日
    浏览(45)
  • elasticsearch的shard优化

    shard简介 Elasticsearch 中的数据会整理为索引。每个索引又由一个或多个分片组成。每个分片都是一个 Lucene 索引实例,您可以将其视作一个独立的搜索引擎,它能够对 Elasticsearch 集群中的数据子集进行索引并处理相关查询。 分片是 Elasticsearch 在集群内分发数据的单位。 Elasti

    2024年02月08日
    浏览(45)
  • elasticsearch 官方优化建议

      a.不要返回过大的结果集。这个建议对一般数据库都是适用的,如果要获取大量结果,可以使用search_after api,或者scroll (新版本中已经不推荐)。   b.避免大的文档。 a.使用批量请求。为了达到最好的效果,可以进行测试,递增地提高bulk的数量,比如从100,到200,再

    2023年04月09日
    浏览(56)
  • Elasticsearch基础优化

    分片策略 分片和副本得设计为ES提供支付分布式和故障转移得特性,但不意味着分片和副本是可以无限分配, 而且索引得分片完成分配后由于索引得路由机制,不能重新修改分片数(副本数可以动态修改) 一个分片得底层为一个lucene索引,会消耗一定文件句柄、内存以及C

    2024年02月03日
    浏览(61)
  • 如何优化 Elasticsearch 查询性能

    优化 Elasticsearch 查询性能需要从多个方面入手。通过合理的索引设计、优化查询语句、优化硬件资源和集群架构等方面的优化,可以显著提高 Elasticsearch 的查询性能。 良好的索引设计是优化 Elasticsearch 查询性能的关键。可以通过以下几个方面来优化索引设计: 索引字段优化

    2024年01月21日
    浏览(39)
  • Elasticsearch 优化分析

    Elasticsearch 是一个分布式RESTful 风格的搜索和数据分析引擎广泛用于搜索引擎 日志分析 安全监测等领域在大数据量和高并发的场景下Elasticsearch 的性能和稳定性非常重要因此需要进行优化设计和分析 Elasticsearch 优化的重要性和目标 Elasticsearch 的优化非常重要,可以提高搜索效

    2024年02月07日
    浏览(22)
  • Elasticsearch配置优化

    以下的优化基础是安装的 Elasticsearch 版本为 7.17.7,同时jdk版本为 1.8.321 1、jvm参数优化   这里说的jvm参数调优,是指elasticsearch安装目录下的jvm.options配置,如下图所示:   这里调整的内容主要是调整垃圾回收的收集器,将默认的cms + parNew 垃圾回收器,替换为G1 垃圾回收

    2024年02月10日
    浏览(31)
  • ElasticSearch的监控与优化

    本篇不详写prometheus、grafana的搭建,需要可以翻阅linux监控篇 ElasticSearch入门篇 docker-compose.yml docker compose up -d prometheus.yml http://ip:9114/metrics grafana :模版id:6483 在搜索引擎的业务场景下,用户一般并不需要那么高的写入实时性。比如你在网站发布一条征婚信息,或者二手交易平

    2024年04月17日
    浏览(26)
  • Elasticsearch 优化常用思路

    Elasticsearch 的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch.yml 中配置,如下:  #----------------------------------- Paths ------------------------------------ #   # Path to directory where to store the data (separate multiple locations by comma

    2024年02月03日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包