Elasticsearch:在搜索中使用衰减函数(Gauss)

news2024/11/25 6:38:08

在我之前的文章 “Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数” 我有讲到 Decay 函数在搜索中的使用。在那里,我有一个例子讲述在规定的时间里,分数不进行衰减。同一的函数也可以适用于地理位置的搜索。位置搜索的范围在规定范围里可以不进行衰减,超过这个范围就会按照衰减函数进行衰减。

想象一下,你需要根据用户位置的接近程度对结果进行排序。完成此任务的方法之一是使用定位和衰减函数。 衰减函数可用于根据比例调整文档的相关性分数。

在我们的示例中,我们将注册一些餐厅,并从用户的位置返回最近的餐厅。

让我们创建我们的地图,现在我们将使用 geo_point 类型,因为我们将使用纬度和经度。

PUT restaurants
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

现在让我们插入一些文档:

POST restaurants/_bulk
{"index":{}}
{"title":"McDonald's 1000","location":{"lat" : -23.525920 ,"lon" : -46.650211}}
{"index":{}}
{"title":"McDonald's Caneca","location":{"lat" : -23.553720  ,"lon" : -46.652940}}
{"index":{}}
{"title":"McDonald's Paulista","location":{"lat" : -23.565920 ,"lon" : -46.650210}}
{"index":{}}
{"title":"McDonald's - Shopping Pátio Higienópolis","location":{"lat" : -23.582460 ,"lon" : -46.688560}}

上面的命令将创建 4 个位置文档。假如我们想在位置 [-23.542719, -46.653965] 进行搜索。它们的相对位置关系如下:

在我们的查询中,我们将使用 Function score query | Elasticsearch Guide [8.6] | Elastic 和 Gaussian 函数,我们希望距离半径 500 米的人获得最大得分(origin - offset <= value <= origin + offset)和 200m (scale) 分数将开始下降。根据 Gaussian function的曲线分布,超过一定的范围衰减非常之快,以至于很快到 0。

 在第一个测试中,我们将使用原点 -23.561581、-46.659540。 此搜索的结果将是最接近的(请注意分数如何随着离原点越远而降低):

GET restaurants/_search?filter_path=**.hits
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": {
            "query": "McDonald's"
          }
        }
      },
      "functions": [
        {
          "gauss": {
            "location": {
              "origin": {
                "lat": -23.542719,
                "lon": -46.653965
              },
              "offset": "500m",
              "scale": "200m",
              "decay": "0.5"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "replace"
    }
  }
}

参数说明:

项目说明
origin用于计算距离的原点。 必须以数字字段的数字、日期字段的日期和地理字段的地理点的形式给出。 地理和数字字段必填。 对于日期字段,默认值为现在。 origin 支持日期数学(例如 now-1h)。
scale所有类型都需要。 定义距离原点的距离 + 偏移量,在该距离处计算的分数将等于衰减参数。 对于地理字段:可以定义为数字+单位(1km,12m,...)。 默认单位是米。 对于日期字段:可以定义为数字+单位(“1h”、“10d”、… )。 默认单位是毫秒。 对于数字字段:任何数字。
offset如果定义了偏移量,衰减函数将只计算距离大于定义的偏移量的文档的衰减函数。 默认值为 0。
decaydecay 参数定义了如何在按比例给定的距离对文档进行评分。 如果没有定义衰减,则距离 scale 的文档将得分为 0.5。

上述查询在离 origin 开始的 200m + 500m 开始进行衰减。它的衰减因子为 0.5。在这个以 200m + 500m 为圆半径的文档得分值将保持不变。

运行上面查询的结果为:

{
  "hits": {
    "hits": [
      {
        "_index": "restaurants",
        "_id": "QxqBNYYB2XodIZsbBsV5",
        "_score": 0.0010342363,
        "_source": {
          "title": "McDonald's Caneca",
          "location": {
            "lat": -23.55372,
            "lon": -46.65294
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "QhqBNYYB2XodIZsbBsV5",
        "_score": 1.2783469e-14,
        "_source": {
          "title": "McDonald's 1000",
          "location": {
            "lat": -23.52592,
            "lon": -46.650211
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "RBqBNYYB2XodIZsbBsV5",
        "_score": 3.5952473e-33,
        "_source": {
          "title": "McDonald's Paulista",
          "location": {
            "lat": -23.56592,
            "lon": -46.65021
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "RRqBNYYB2XodIZsbBsV5",
        "_score": 0,
        "_source": {
          "title": "McDonald's - Shopping Pátio Higienópolis",
          "location": {
            "lat": -23.58246,
            "lon": -46.68856
          }
        }
      }
    ]
  }
}

正像我们看到的那样,搜索的结果是我们所期望的。从返回的分数来看在范围里的文档的分数不受影响,但是一旦超出范围,搜索到的文档的分数会被加权并得到衰减。

我们再次修改 origin 的位置到  -23.542719, -46.653965。它们的相对关系显示如下:

我们再次进行搜索:

GET restaurants/_search?filter_path=**.hits
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": {
            "query": "McDonald's"
          }
        }
      },
      "functions": [
        {
          "gauss": {
            "location": {
              "origin": {
                "lat": -23.542719,
                "lon": -46.653965
              },
              "offset": "500m",
              "scale": "200m",
              "decay": "0.5"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "replace"
    }
  }
}

 我们可以看到如下的结果:

{
  "hits": {
    "hits": [
      {
        "_index": "restaurants",
        "_id": "QxqBNYYB2XodIZsbBsV5",
        "_score": 0.0010342363,
        "_source": {
          "title": "McDonald's Caneca",
          "location": {
            "lat": -23.55372,
            "lon": -46.65294
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "QhqBNYYB2XodIZsbBsV5",
        "_score": 1.2783469e-14,
        "_source": {
          "title": "McDonald's 1000",
          "location": {
            "lat": -23.52592,
            "lon": -46.650211
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "RBqBNYYB2XodIZsbBsV5",
        "_score": 3.5952473e-33,
        "_source": {
          "title": "McDonald's Paulista",
          "location": {
            "lat": -23.56592,
            "lon": -46.65021
          }
        }
      },
      {
        "_index": "restaurants",
        "_id": "RRqBNYYB2XodIZsbBsV5",
        "_score": 0,
        "_source": {
          "title": "McDonald's - Shopping Pátio Higienópolis",
          "location": {
            "lat": -23.58246,
            "lon": -46.68856
          }
        }
      }
    ]
  }
}

这是介绍衰减函数的方法之一,我希望它有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++原子变量atomic详解

C原子变量atomic详解一、简介二、成员函数2.1、构造函数2.2、is_lock_free函数2.3、store函数2.4、load函数2.5、exchange函数2.6、compare_exchange_weak函数2.7、compare_exchange_strong函数2.8、专业化支持的操作三、使用示例总结一、简介 原子类型的对象包含特定type ()的…

分享5个超好用的Vue.js库

开发人员最好的朋友和救星就是这些第三方库&#xff0c;无论是开发新手还是经验丰富的老手&#xff0c;我们都喜欢开源软件包。借助开源库加速Vue项目的开发进度是现代前端开发比较常见的方式&#xff0c;这几个 Vue.js库&#xff0c;建议尽早用上&#xff0c;加速你的项目开发…

集合(Set、Collections、Map、集合嵌套)

目录 Set系列集合 Set系列集合概述 HashSet元素无序的底层原理&#xff1a;哈希表 HashSet元素去重复的底层原理 实现类&#xff1a;LinkedHashSet 实现类&#xff1a;TreeSet Collection体系的特点、使用场景总结 补充知识&#xff1a;可变参数 补充知识&#xff1a;集…

自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改,删除,新增操作

Jmeter也可以连接mysql数据库&#xff0c;通过JDBC去调用数据库内的参数到HTTP请求中进行接口测试&#xff0c;可以说是相当方便 自动化测试实战篇&#xff08;7&#xff09;jmeter连接mysql数据库&#xff0c;实现单表、多表、三表查询&#xff0c;并对表中数据进行修改&#…

多线程带来的的风险-线程安全

❣️关注专栏&#xff1a;: JavaEE 这篇文章将为大家描述线程安全问题的原因和解决方案。线程安全是多线程编程中最难的地方&#xff0c;也是重要的地方&#xff0c;还是一个最容易出错的地方&#xff0c;也是面试中容易考的要点&#xff0c;同样也是我们以后工作中经常爱出错的…

【软件测试】8年资深测试总结出的测试学习经验,从入门到测试开发......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试圈子里有一句话…

Python语言零基础入门教程(九)

Python pass 语句 Python pass 是空语句&#xff0c;是为了保持程序结构的完整性。 pass 不做任何事情&#xff0c;一般用做占位语句。 Python 语言 pass 语句语法格式如下&#xff1a; pass测试实例&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Pytho…

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议

更改Oracle的配置文件&#xff1a;Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态&#xff1a;lsnrctl status2.停止监听器&#xff1a;lsnrctl stop3.连接数据库&#xff1a;sqlplus / as sysdba4.停止数据…

怡合达业务大规模容器化最佳实践

作者&#xff1a;肖念康&#xff0c;东莞怡合达智能制造供应链资深 Java 开发工程师&#xff0c;主要负责公司内部 DevOps、代码托管平台、任务需求管理平台的研发及其他项目的管理&#xff0c;云原生的研究与开发工作。 公司简介 怡合达致力于自动化零部件研发、生产和销售&am…

[C++] -- 模板初阶

文章目录函数模板函数模板的隐式实例化显式实例化模板参数的匹配原则类模板模板函数声明和定义分离会链接错误函数模板 对于一些参数不同但功能类似的函数&#xff0c;C有函数重载&#xff0c;但是函数重载有一些缺陷&#xff1a; 重载的函数只是参数不同&#xff0c;代码复用…

【五六七人口普查】我国省市两级家庭户住房状况

人口数据是我们在各项研究中最常使用的数据&#xff01;之前我们分享过第七次人口普查&#xff08;简称七普&#xff09;的数据&#xff01;很多小伙伴拿到数据后都反馈数据非常好用&#xff0c;同时很多小伙伴咨询有没有前面几次人口普查的数据&#xff0c;这样方便做人口变化…

7.1 微服务-SpringCloud(二)

目录 前言 7.1.5 Hystrix 7.1.5.1 什么是Hystrix 7.1.5.2 雪崩问题 7.1.5.3 线程隔离&#xff0c;服务降级 7.1.5.4 搭建 7.1.5.4.1 引入依赖 7.1.5.4.2 开启熔断 7.1.5.4.3 编写降级逻辑 1.局部降级逻辑 2.全局降级逻辑 7.1.5.4.4 设置超时 7.1.5.5 服务熔断 7.…

2023-02-09 - 1 Elasticsearch简介

1 Elasticsearch的基本概念 1.1 索引 在使用传统的关系型数据库时&#xff0c;如果对数据有存取和更新操作&#xff0c;需要建立一个数据库。相应地&#xff0c;在ES中则需要建立索引。用户的数据新增、搜索和更新等操作的对象全部对应索引。 1.2 文档 在使用传统的关系型数…

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;午后集体涨超1%&#xff0c;创业板指盘中涨超1.7%。芯片板块集体大涨&#xff0c;…

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…

内网资源探测

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;内网安全 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远是…

计算机软件技术基础复习

数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构&#xff1a;指相互…

SQLSERVER 的 truncate 和 delete 有区别吗?

一&#xff1a;背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 &#xff0c;这是一个很有意思的话题&#xff0c;本篇我就试着来回答一下&#xff0c;如果下次大家遇到这类问题&#xff0c;我的答案应该可以帮你成功度过吧。 二&#xff1…

Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)

预期效果&#xff1a;&#xff08;借助iview-ui的在线体验页面示意一下&#xff09; 项目中只有一部分页面需要缓存&#xff0c;且存在多级路由的页面。每打开一个菜单&#xff0c;就会新增一个 Tab标签&#xff0c;只要 Tab标签不关闭&#xff0c;对应的页面就会被缓存&#x…

Java Jackson TypeReference获取泛型类型信息【泛型】

Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化&#xff0c;及TyperReference的实现原理。对于获取泛型类型信息的场景&#xff0c;TypeReference是一个可以参考的通用解决方案。 Jackson ObjectMapper的readVa…