elasticsearch version: 7.10.1
在Elasticsearch中,gauss作为衰减函数(decay function)被用于function_score查询中,用于实现基于地理位置或其他数值字段的衰减权重评分。gauss衰减函数模拟了高斯分布,即距离中心点越近的文档,其得分越高;随着距离增大,得分按照高斯分布规律衰减。
gauss的语法
GET /your_index/_search
{
"query": {
"function_score": {
"query": {
// 基础查询,可以是任何有效的Elasticsearch查询
"match_all": {}
},
"functions": [
{
"gauss": {
// 距离衰减字段,这里假设是location
"location": {
// 中心点坐标
"origin": "51.5074, -0.1278", // 伦敦市中心经纬度
// 高斯衰减的标准化差(sigma),影响衰减速度
"scale": "10km", // 单位可以是千米、米等
// 斜率因子(offset),影响衰减起点
"offset": "0km",
// 缩放因子(decay),影响衰减陡峭程度
"decay": 0.5
}
}
}
]
}
}
}
- location字段(假定为地理位置类型)与指定中心点的距离来计算衰减得分
- scale参数决定了衰减的速度,即距离中心点多少单位后得分下降一半
- offset参数可以让衰减在距离中心点一定距离后才开始
- decay参数是对衰减曲线的进一步调整,控制衰减的陡峭程度
标题
gauss的案例
场景
假设我们有一个商店索引,其中包含地理位置信息,并且我们希望根据顾客位置对其附近的商店进行优先排序
索引创建
PUT /shops
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"location": {
"type": "geo_point"
}
}
}
}
文档插入
POST /shops/_doc
{
"name": "Shop A",
"location": "51.5074,-0.1278" // 伦敦大本钟坐标
}
POST /shops/_doc
{
"name": "Shop B",
"location": "48.8566,2.3522" // 巴黎埃菲尔铁塔坐标
}
POST /shops/_doc
{
"name": "Shop C",
"location": "40.7128,-74.0060" // 纽约时代广场坐标
}
POST /shops/_doc
{
"name": "Shop D",
"location": "37.7749,-122.4194" // 旧金山金门大桥坐标
}
POST /shops/_doc
{
"name": "Shop E",
"location": "-33.8521,151.2111" // 悉尼歌剧院坐标
}
POST /shops/_doc
{
"name": "Shop F",
"location": "55.7507,37.6173" // 莫斯科红场坐标
}
POST /shops/_doc
{
"name": "Shop G",
"location": "35.6895,139.6917" // 东京晴空塔坐标
}
POST /shops/_doc
{
"name": "Shop H",
"location": "-23.5505,-46.6333" // 圣保罗独立公园坐标
}
查询语句
GET /shops/_search
{
"query": {
"function_score": {
"query": {
"match_all": {} // 这里仅作示例,实际应用中应替换为更具针对性的查询条件
},
"functions": [
{
"gauss": {
"location": {
"origin": "51.5074,-0.1278", // 用户所在位置坐标
"scale": "10km", // 衰减半径为10公里
"offset": "0km", // 衰减起始位置为零
"decay": 0.5 // 衰减指数
}
}
}
],
"score_mode": "multiply", // 各项得分的组合方式
"boost_mode": "replace" // 得分替换还是累加
}
}
}