Elastic Search 地理空间搜索实现

2023-12-28

我试图了解 elasticsearch 如何在内部支持地理空间搜索。

对于基本搜索,它使用倒排索引;但它如何与附加搜索条件(例如搜索特定半径内的特定文本)结合起来。

我想了解如何存储和查询索引以支持这些查询的内部结构


文本查询和地理查询是分开执行的。让我们举一个具体的例子:

PUT restaurants
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      },
      "menu": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

POST restaurants/_doc
{
  "name": "rest1",
  "location": {
    "lat": 40.739812,
    "lon": -74.006201
  },
  "menu": [
    "european",
    "french",
    "pizza"
  ]
}

POST restaurants/_doc
{
  "name": "rest2",
  "location": {
    "lat": 40.7403963,
    "lon": -73.9950026
  },
  "menu": [
    "pizza",
    "kebab"
  ]
}

那么你就会match文本字段并应用geo_distance filter:

GET restaurants/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "menu": "pizza"
          }
        },
        {
          "geo_distance": {
            "distance": "0.5mi",
            "location": {
              "lat": 40.7388,
              "lon": -73.9982
            }
          }
        },
        {
          "function_score": {
            "query": {
              "match_all": {}
            },
            "boost_mode": "avg",
            "functions": [
              {
                "gauss": {
                  "location": {
                    "origin": {
                      "lat": 40.7388,
                      "lon": -73.9982
                    },
                    "scale": "0.5mi"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

自从geo_distance查询仅分配一个布尔值(-->score=1;仅检查位置是否在给定半径内),您可能需要应用高斯function_score提升更接近给定原点的位置。

最后,这些分数可以通过使用_geo_distance按邻近程度对您要订购的位置进行排序(当然,同时保持match查询完好):

...
  "query: {...},
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 40.7388,
          "lon": -73.9982
        },
        "order": "asc"
      }
    }
  ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elastic Search 地理空间搜索实现 的相关文章

随机推荐

  • iPad 上的 UIActivityViewController

    我一直在使用下面的代码来展示UIActivityViewController当我使用 Xcode 6 Swift 1 2 和 iOS 8 时 它工作得很好 但是 当我更新时 它显示UIActivityViewController但它完全是空
  • php中的十六进制数填充零

    不知道我在这里做错了什么 当我在十六进制数字前面填充零时 它似乎改变了数字 number 1741 strtoupper dechex number output is 6CD sprintf 03x strtoupper dechex n
  • JavaScript 压缩

    我正在寻找可以压缩JavaScript源代码的工具 我发现一些网络工具只能删除空格字符 但也许存在更好的工具 可以压缩用户的函数名称 字段名称 删除未使用的字段等 经常用来压缩 JS 代码的工具是YUI压缩器 http developer
  • LESS/SASS CSS 与缩小/优化相反?

    我想知道我可以说 LESS SASS CSS 预处理器 我认为他们被称为 与缩小等优化相反 我想知道是否会对性能产生明显的影响 或者您认为易于开发更重要 我问这个是因为 LESS CSS 生成的是类似的东西 body div1 div2 p
  • 使用 SimpleXML 的 XML 声明标签

    我开始使用带有注释的简单 XML 框架 link http simple sourceforge net download stream doc tutorial tutorial php namesoace 对于 Java 但我不明白如何
  • matplotlib 图例位置编号

    我开始使用 Python 进行科学计算 而且我真的很喜欢它 但是我对 matplotlib pylab legend 函数的一个功能感到困惑 特别是 位置功能允许人们使用数字指定图例的位置 遵循以下方案 最好 0 右上角 1 左上 2 左下
  • 如何将对象字符串解析为javascript对象? [复制]

    这个问题在这里已经有答案了 我从数据库得到这个字符串 from 15 00 to 16 00 from 16 00 to 17 00 from 17 00 to 18 00 from 18 00 to 19 00 它是一个字符串 在这种情况
  • 在多个显示器上居中用户表单

    我在网上搜索了一段时间 确实找到了一些解决方案 但似乎没有一个对我有帮助 我在 Excel 2010 中有一个用户窗体 我想将其置于 Excel 窗口的中心 我有双显示器 它似乎总是在两个显示器之间居中 我知道您可以编辑一些属性 例如 St
  • Objective-C 中如何改变鼠标光标

    我正在制作一个图像编辑应用程序 但如果没有像 Photoshop 中的画笔那样的光标 它看起来非常不完整 如何设置图标 并在退出应用程序时将其更改回来 这是我的头文件中的代码 以防万一需要 interface test NSWindow
  • PHP:涉及爆炸键的映射数组[重复]

    这个问题在这里已经有答案了 在尝试使用多个 foreach 循环解决此问题后 我仍然不知道如何映射 arr to arr mapped 我需要爆炸钥匙 arr获取最多具有三个要创建的新键的元素 arr mapped
  • 通过两个模型来查看[重复]

    这个问题在这里已经有答案了 我是 mvc 新手 并尝试通过用它做一个小项目来学习它 我有一个页面应该显示特定日期的货币和天气 所以我应该通过货币模型和天气模型 我已经完成了通过货币模型并且工作正常 但我不知道如何通过第二个模型 大多数教程都
  • 为什么 python MSAL 身份验证卡在 ConfidentialClientApplication 处?

    我有这段 python 代码 它在我的计算机上完美运行 但当我在带有 Amazon Linux 的 EC2 上运行它时 它会卡在这个函数中 检查了所有网络和防火墙规则 一切正常 事实上 如果我从我的 PC 获取令牌并尝试通过 cURL 直接
  • 如何使用 prometheus Alertmanager 在工作时间之外抑制警报?

    我们的应用程序依赖于仅在工作时间内活跃的数据源 我们在普罗米修斯中设置了警报 以便在溪流干涸时通知我们 但是 我们不希望在工作时间之外收到 错误 警报 我跟着这个帖子 https medium com tom fawcett time of
  • 如何限制日志记录频率?

    任何日志库是否包含限制日志消息频率的方法 我的意思是假设我有一个等待循环并且它记录 没有完成 如何使下一条 未完成 消息仅在 1 秒后记录 我知道我可以自己编程 大多数日志记录库都支持过滤器来限制日志记录频率 请参阅此答案SLF4J 或 L
  • 如何使用 highcharts 将图表图像保存到服务器上?

    With highcharts you have a built in button to download the current chart example http www highcharts com demo http www h
  • 我可以更新 ProgressDialog 的字符串消息吗?

    我在 Android AsyncTak 中设置了一个进度对话框并且它可以工作 我的问题是可以在 AsyncTask 的 onProgressUpdate 方法中更新 ProgressDialog 显示的字符串 我想使用publishProg
  • wkhtmltopdf 自定义字体字母间距

    I m running wkhtmltopdf on linux server centos 10 x86 64 I m trying to add Times New Roman font to the page I see the fo
  • Vim 颜色太亮(终端)

    我的 Vim 和 iTerm2 有问题 颜色太亮 对于所有主题 它适用于 Terminal app 和 MacVim 所以我想这一定是我完全错过了 iTerm2 中的某些设置 The picture below shows you the
  • Dropzone 无法以编程方式在 div 内工作

    我遇到了 dropzone 问题 我试图将其包含在 div 中 但不起作用 起初我的js上没有 div dropzone 东西 并且没有出现错误 但是上传部分无法正常工作 这是因为我从未表明 dropzone 类位于 div 内 当我添加时
  • Elastic Search 地理空间搜索实现

    我试图了解 elasticsearch 如何在内部支持地理空间搜索 对于基本搜索 它使用倒排索引 但它如何与附加搜索条件 例如搜索特定半径内的特定文本 结合起来 我想了解如何存储和查询索引以支持这些查询的内部结构 文本查询和地理查询是分开执