jjzjj

php - Elasticsearch 地理点查询过滤器

coder 2024-05-02 原文

我正在尝试将 geo_point 用于距离,但它始终显示位置类型为 double 而不是 geo_point 如何设置映射到 geo_point 的位置。

实际上我必须找到 5km 范围内的所有记录。

 "pin" : {
             "properties" : {
             "location" : {
             "properties" : {
             "lat" : {
             "type" : "double"
             },
                 "lon" : {
                 "type" : "double"
                 }
              }
              },
                  "type" : {
                  "type" : "string"
                  }
              }
              },

当我尝试使用下面的查询进行搜索以查找距离德里 lat long 5 公里以内的结果时:

 {
          "query": {
            "filtered": {
              "query": {
                "match_all": {}
              },
              "filter": {
                "pin": {
                  "distance": "5",
                  "distance_unit": "km",
                  "coordinate": {
                    "lat": 28.5402707,
                    "lon": 77.2289643
                  }
                }
              }
            }
          }
        }

它向我显示错误 query_parsing_exception 和没有为 [pin] 注册的查询。我无法弄清楚问题所在。它总是抛出这个异常

  {

            "error": {
                "root_cause": [
                    {
                        "type": "query_parsing_exception",
                        "reason": "No query registered for [pin]",
                        "index": "find_index",
                        "line": 1,
                        "col": 58
                    }
                ],
                "type": "search_phase_execution_exception",
                "reason": "all shards failed",
                "phase": "query",
                "grouped": true,
                "failed_shards": [
                    {
                        "shard": 0,
                        "index": "find_index",
                        "node": "DtpkEdLCSZCr8r2bTd8p5w",
                        "reason": {
                            "type": "query_parsing_exception",
                            "reason": "No query registered for [pin]",
                            "index": "find_index",
                            "line": 1,
                            "col": 58
                        }
                    }
                ]
            },
            "status": 400

        }

请帮我解决这个问题。我如何设置 geo_point 并解决此异常错误和状态 400 和 all_shards_failed 错误

最佳答案

你只需要像这样映射你的 pin 类型,即使用 geo_point data type :

# 1. first delete your index
DELETE shouut_find_index

# 2. create a new one with the proper mapping
PUT shouut_find_index
{
  "mappings": {
    "search_shouut": {
      "properties": {
        "location": {
          "type": "geo_point"
        },
        "type": {
          "type": "string"
        }
      }
    }
  }
}

然后你可以像这样索引一个文档

PUT shouut_find_index/search_shouut/1
{ 
   "location": {
      "lat": 28.5402707,
      "lon": 77.2289643
   },
   "type": "dummy"
}

最后你的查询看起来像这样

POST shouut_find_index/search_shouut/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "5km",
          "location": {
            "lat": 28.5402707,
            "lon": 77.2289643
          }
        }
      }
    }
  }
}

关于php - Elasticsearch 地理点查询过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36997597/

有关php - Elasticsearch 地理点查询过滤器的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  8. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  9. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  10. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

随机推荐