当前位置: 首页 > 知识库问答 >
问题:

按地理距离汇总的订单条款

聂永怡
2023-03-14

所以我这里有个问题。。。

我正在使用ruby gem与Elasticsearch进行通信

=> #<Chewy::SnippetPagesIndex::Query:0x007f911c6b1610
 @_collection=nil,
 @_fully_qualified_named_aggs={"chewy::snippetpagesindex"=>{"chewy::snippetpagesindex::snippetpage"=>{}}},
 @_indexes=[Chewy::SnippetPagesIndex],
 @_named_aggs={},
 @_request=nil,
 @_response=nil,
 @_results=nil,
 @_types=[],
 @criteria=
  #<Chewy::Query::Criteria:0x007f911c6b1458
   @aggregations=
    {:group_by=>{:terms=>{:field=>"seo_area.suburb.id", :order=>{:_count=>"asc"}}, :aggs=>{:by_top_hit=>{:top_hits=>{:size=>10}}}}},
   @facets={},
   @fields=[],
   @filters=
    [{:geo_distance=>{:distance=>"100km", "seo_area.suburb.coordinates"=>"-27.9836052, 153.3977354"}},
     {:bool=>
       {:must_not=>[{:terms=>{:id=>[1]}}, {:terms=>{"seo_area.suburb.id"=>[5559]}}],
        :must=>[{:term=>{:path_category=>"garden-services"}}, {:term=>{:status=>"active"}}, {:exists=>{:field=>"path_area"}}],
        :should=>[]}}],
   @options=
    {:query_mode=>:must,
     :filter_mode=>:and,
     :post_filter_mode=>:and,
     :preload=>
      {:scope=>
        #<Proc:0x007f911c6b1700@/Users/serviceseeking/Work/serviceseeking/engines/seo/app/concepts/seo/snippet_page/twins/search.rb:45 (lambda)>},
     :loaded_objects=>true},
   @post_filters=[],
   @queries=[],
   @request_options={},
   @scores=[],
   @script_fields={},
   @search_options={},
   @sort=[{:_geo_distance=>{"seo_area.suburb.coordinates"=>"-27.9836052, 153.3977354", :order=>"asc", :unit=>"km"}}],
   @suggest={},
   @types=[]>,
 @options={}>

我经过的是这个...

     aggs: {
        by_seo_area_suburb_id: {
          terms: {
            field: "seo_area.suburb.id",
            size: 10,
            order: { by_distance: "desc" }
          },
          aggs: {
            by_top_hit: {
              top_hits: { size: 10 }
            },
            by_distance: {
              geo_distance: {
                field: "seo_area.suburb.coordinates",
                origin: "52.3760, 4.894",
                ranges: [
                  { from: 0, to: 1 },
                  { from: 1, to: 2 }
                ]
              }
            }
          }
        }
      }

但我收到了这个错误。。。

[500] {"error":{"root_cause":[{"type":"aggregation_execution_exception","reason":"Invalid terms aggregation order path [by_distance]. Terms buckets can only be sorted on a sub-aggregator path that is built out of zero or more single-bucket aggregations within the path and a final single-bucket or a metrics aggregation at the path end."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"snippet_pages","node":"srrlBssmSEGsqpZnPnOJmA","reason":{"type":"aggregation_execution_exception","reason":"Invalid terms aggregation order path [by_distance]. Terms buckets can only be sorted on a sub-aggregator path that is built out of zero or more single-bucket aggregations within the path and a final single-bucket or a metrics aggregation at the path end."}}]},"status":500}

简单地说。。。

术语桶只能在子聚合器路径上排序,该子聚合器路径由路径中的零个或多个单桶聚合和路径端的最终单桶或指标聚合构建。

有什么想法吗?

共有1个答案

金昌胤
2023-03-14

你有这样的水桶:

1-2

2-3

4-5

等等。这些不是具有自然顺序的单一值桶。这就是异常告诉你的。所以你需要一些东西来把它融化成单一值。

即使你可以点这个。你为什么要这么做?距离在1和2之间的所有对象都将具有相同的比较值,并且它们的顺序将未定义。如果足够让您知道哪个是0-1和1-2等等,只需改变聚合顺序即可。首先,计算距离并对术语进行分组。

总而言之,我认为您有一个用例,其中聚合不是您想要的,因为请考虑以下两个文档:

{ name: "peter", location: [0,0] }
{ name: "peter", location: [100,0] }

显然,两个彼得斯会在一个术语聚合中融合为一个。但它们有两个不同的位置,因此距离(几乎)总是不同的。那么,你如何按距离订购彼得斯呢?一旦聚合了一个字段,所有其他字段都或多或少地与之解耦,并且不能使用其他字段来实现这一点。

所以如果你想要这样的东西,你很可能必须通过正常的搜索。了解如何按距离对搜索进行排序:

https://www.elastic.co/guide/en/elasticsearch/guide/current/sorting-by-distance.html

 类似资料:
  • 我正在尝试按地理距离对具有嵌套地理点映射的索引进行排序。 这是我的简化映射: 这里,每个组织可以有几个地点点。 文档: 这是我的查询(PHP数组): 预期结果 : 我希望按geo_point排序资源(检查每个位置,然后检查某个位置是否靠近给定的纬度/经度)

  • 问题内容: 我需要测量以字符串形式提供名称的两个地方之间的物理距离。由于有时名称的书写方式略有不同,因此我一直在寻找一个可以帮助我测量差异的库,然后将其与纬度和经度结合起来以选择正确的匹配项。首选语言:Java或PHP。 有什么建议? 问题答案: 看看Levenshtein距离。这是一种测量两个字符串彼此之间有多不同的方法。 希望我能正确理解你的问题;在与“经度”相同的句子中使用“距离”可能会造成

  • 本文向大家介绍C ++中树的距离总和,包括了C ++中树的距离总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一棵无向的,连接的树,其中有N个节点。这些标记为0 ... N-1,给出了N-1边。第i条边将节点edge [i] [0]和edge [i] [1]连接在一起。我们必须找到一个列表,其中ans [i]是节点i与所有其他节点之间的距离之和。 因此,如果输入像N = 6并且edges

  • 问题内容: 我有以下模型: 我应如何查询以距离排序(距离为无穷大)? 如果需要,可以在PosgreSQL,GeoDjango上工作。 问题答案: 首先,最好使一个点字段而不是使lat和lnt分开: 然后,你可以像这样过滤它:

  • 问题内容: 我有一个MySQL表(MyISAM),其中包含我根据与另一对经纬度对之间的距离(大圆公式)从中选择的约20万经纬度对条目。(例如,在50.281852,2.504883附近的10公里半径内的所有条目) 我的问题是此查询大约需要0.28秒。仅针对这200k条目运行(每天仍在增加)。而0.28秒。通常情况下会很好,此查询会经常运行,因为它会增强我的Web应用程序的主要功能,而且通常是较大查

  • 因此,我的文档(帖子)中有一个位置字段。此位置字段是一个地理形状。它可以是一个点或多边形。有时,我可能不得不使用地理距离过滤器来获取标记最接近某个坐标的帖子(仅具有键入地理形状,而不是多边形)。然而,在尝试使用geo_距离过滤器时,我遇到了以下错误。 是否有一种方法可以在类型的地理图形上使用地理距离过滤器?