仅针对具有过滤器的排序查询结果聚合脚本,而不是完整数据集

亚当

仅供参考-elasticsearch @ v1.5; npm elasticsearch @ 4.0.2

对于我的特定用例,我需要找到其他点附近的五个最近点,并计算这五个结果的最大距离。由于某种原因,我在下面的查询返回的是所有过滤数据的最大距离,而不是最近的五个。

到目前为止,这是我的查询:

    elasticsearchAPI = Meteor.npmRequire('elasticsearch');
    esClient = new elasticsearchAPI.Client({
        host: 'myHost'
    });

    var esQueryObject = {
        "index": "ma_homes",
        "size": 5,
        "body": {
            "query": {
                "filtered": {
                    "query": {
                        "match_all": {}
                    },
                    "filter": {
                        "geo_distance": {
                            "LOCATION": {
                                "lat": 42.5125339,
                                "lon": -71.06748
                            },
                            "distance": "3mi",
                            "optimize_bbox": "memory"
                        }
                    }
                }
            },
            "size": 5,
            "sort": [{
                "_geo_distance": {
                    "LOCATION": {
                        "lat": 42.5125339,
                        "lon": -71.06748
                    },
                    "order": "asc",
                    "unit": "mi",
                    "distance_type": "sloppy_arc"
                }
            }],
            "fields": ["F1_V7_2_F1TOWN"],
            "aggs": {
                "max_dist": {
                    "max": {
                        "script": "doc[\u0027LOCATION\u0027].arcDistanceInMiles(lat,lon)",
                        "params" : {
                            "lat" : 42.5125339,
                            "lon" : -71.06748
                        }
                    }
                }
            }
        }
    }



     try {
        esClient.search(esQueryObject, function(err, res) {
            if ( err ) console.log("err: ", err);
            if ( res ) {
                console.log("res: ", JSON.stringify(res, null, "\t"));
            };
        });
    }
    catch(error) {
        console.log("search err: ", error);
    };

我的问题是返回的max_dist为2.99,但是从点击数中我可以清楚地看到它应该仅为0.02268!

最后,有没有更好的方法来计算最大距离?我不必使用脚本。

查看下面的结果:

I20160729-14:46:08.447(-7)? {
I20160729-14:46:08.447(-7)?     "took": 119,
I20160729-14:46:08.447(-7)?     "timed_out": false,
I20160729-14:46:08.447(-7)?     "_shards": {
I20160729-14:46:08.447(-7)?         "total": 5,
I20160729-14:46:08.448(-7)?         "successful": 5,
I20160729-14:46:08.448(-7)?         "failed": 0
I20160729-14:46:08.448(-7)?     },
I20160729-14:46:08.448(-7)?     "hits": {
I20160729-14:46:08.448(-7)?         "total": 19428,
I20160729-14:46:08.448(-7)?         "max_score": null,
I20160729-14:46:08.452(-7)?         "hits": [
I20160729-14:46:08.452(-7)?             {
I20160729-14:46:08.452(-7)?                 "_index": "ma_homes",
I20160729-14:46:08.452(-7)?                 "_type": "home",
I20160729-14:46:08.453(-7)?                 "_id": "AVY1KqHN5rKRAKXZHxQf",
I20160729-14:46:08.453(-7)?                 "_score": null,
I20160729-14:46:08.453(-7)?                 "fields": {
I20160729-14:46:08.453(-7)?                     "F1_V7_2_F1TOWN": [
I20160729-14:46:08.453(-7)?                         "7WHITECIRWAKEFIELDMA"
I20160729-14:46:08.454(-7)?                     ]
I20160729-14:46:08.454(-7)?                 },
I20160729-14:46:08.454(-7)?                 "sort": [
I20160729-14:46:08.454(-7)?                     0.013847018573431258
I20160729-14:46:08.454(-7)?                 ]
I20160729-14:46:08.455(-7)?             },
I20160729-14:46:08.455(-7)?             {
I20160729-14:46:08.455(-7)?                 "_index": "ma_homes",
I20160729-14:46:08.455(-7)?                 "_type": "home",
I20160729-14:46:08.456(-7)?                 "_id": "AVY1Ewoc5rKRAKXZGhMp",
I20160729-14:46:08.456(-7)?                 "_score": null,
I20160729-14:46:08.456(-7)?                 "fields": {
I20160729-14:46:08.456(-7)?                     "F1_V7_2_F1TOWN": [
I20160729-14:46:08.456(-7)?                         "8WHITECIRWAKEFIELDMA"
I20160729-14:46:08.457(-7)?                     ]
I20160729-14:46:08.457(-7)?                 },
I20160729-14:46:08.457(-7)?                 "sort": [
I20160729-14:46:08.458(-7)?                     0.01675513175670524
I20160729-14:46:08.458(-7)?                 ]
I20160729-14:46:08.458(-7)?             },
I20160729-14:46:08.458(-7)?             {
I20160729-14:46:08.458(-7)?                 "_index": "ma_homes",
I20160729-14:46:08.459(-7)?                 "_type": "home",
I20160729-14:46:08.459(-7)?                 "_id": "AVY1T0cn5rKRAKXZJwC8",
I20160729-14:46:08.459(-7)?                 "_score": null,
I20160729-14:46:08.459(-7)?                 "fields": {
I20160729-14:46:08.459(-7)?                     "F1_V7_2_F1TOWN": [
I20160729-14:46:08.460(-7)?                         "10WHITECIRWAKEFIELDMA"
I20160729-14:46:08.460(-7)?                     ]
I20160729-14:46:08.460(-7)?                 },
I20160729-14:46:08.460(-7)?                 "sort": [
I20160729-14:46:08.461(-7)?                     0.018417500448048605
I20160729-14:46:08.461(-7)?                 ]
I20160729-14:46:08.463(-7)?             },
I20160729-14:46:08.464(-7)?             {
I20160729-14:46:08.464(-7)?                 "_index": "ma_homes",
I20160729-14:46:08.464(-7)?                 "_type": "home",
I20160729-14:46:08.464(-7)?                 "_id": "AVY1Xb2P5rKRAKXZKhUh",
I20160729-14:46:08.464(-7)?                 "_score": null,
I20160729-14:46:08.465(-7)?                 "fields": {
I20160729-14:46:08.465(-7)?                     "F1_V7_2_F1TOWN": [
I20160729-14:46:08.465(-7)?                         "11WHITECIRWAKEFIELDMA"
I20160729-14:46:08.465(-7)?                     ]
I20160729-14:46:08.466(-7)?                 },
I20160729-14:46:08.466(-7)?                 "sort": [
I20160729-14:46:08.466(-7)?                     0.018816876925529115
I20160729-14:46:08.467(-7)?                 ]
I20160729-14:46:08.467(-7)?             },
I20160729-14:46:08.467(-7)?             {
I20160729-14:46:08.468(-7)?                 "_index": "ma_homes",
I20160729-14:46:08.468(-7)?                 "_type": "home",
I20160729-14:46:08.468(-7)?                 "_id": "AVY1TNJh5rKRAKXZJnx0",
I20160729-14:46:08.468(-7)?                 "_score": null,
I20160729-14:46:08.469(-7)?                 "fields": {
I20160729-14:46:08.469(-7)?                     "F1_V7_2_F1TOWN": [
I20160729-14:46:08.470(-7)?                         "6WHITECIRWAKEFIELDMA"
I20160729-14:46:08.470(-7)?                     ]
I20160729-14:46:08.470(-7)?                 },
I20160729-14:46:08.471(-7)?                 "sort": [
I20160729-14:46:08.471(-7)?                     0.022680252269458714
I20160729-14:46:08.471(-7)?                 ]
I20160729-14:46:08.471(-7)?             }
I20160729-14:46:08.471(-7)?         ]
I20160729-14:46:08.472(-7)?     },
I20160729-14:46:08.472(-7)?     "aggregations": {
I20160729-14:46:08.472(-7)?         "max_dist": {
I20160729-14:46:08.472(-7)?             "value": 2.999906924854209,
I20160729-14:46:08.473(-7)?             "value_as_string": "2.999906924854209"
I20160729-14:46:08.473(-7)?         }
I20160729-14:46:08.473(-7)?     }
I20160729-14:46:08.474(-7)? }
pickypg

这里有两件事是错误的,第二件事与第一件事紧密相关:

  1. 您假设排序顺序对聚合有任何影响。没有。您可能需要看一下Elasticsearch:确定聚合范围的权威指南
    • 要点是,查询的总结果(包括未返回的命中数)是聚合范围的一部分。在您的确切情况下,它指出存在"total": 19428与您的搜索匹配的文档。您刚得到最近的5。
  2. 您正在按升序排序,这意味着它从最小到最大排序。这意味着您只会得到最接近的5个最接近的距离,这就是您想要的,但这并不意味着聚合所看到的就是真实的最大距离。

对于这些问题,您需要弄清楚如何限制前5名,或者根本不进行汇总,我认为这是最简单的方法。只需获得前5名,然后获取最后一个值,就可以完成两个所需的答案。

由于3英里,排序限制在3英里之内,这很好,但是也许您可以根据需要通过使用更快的搜索来做一些更好的事情distance_type

{
  "size": 5,
  "_source": "F1_V7_2_F1TOWN",
  "query": {
    "filtered": {
      "filter": [
        {
          "geo_distance": {
            "LOCATION": {
              "lat": 42.5125339,
              "lon": -71.06748
            },
            "distance": "3mi",
            "distance_type": "plane"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "_geo_distance": {
        "LOCATION": {
          "lat": 42.5125339,
          "lon": -71.06748
        },
        "order": "asc",
        "unit": "mi",
        "distance_type": "sloppy_arc"
      }
    }
  ]
}

注意,我不进行汇总,而是使用_source代替fieldsfields用于存储的字段,而不是限制源文档的输出),我切换到使用plane过滤器,distance_type因为对于极点以外的距离它更快我怀疑太多的房屋会在两极使用距离。为了计分,我将其保留为sloppy_arc,因为它在过滤后可以使用稍微完善一些的方程式。

我只得到5个文档,而在这5个文档中,最后一个文档是得分最高的文档。

值得一提的是,ES 2.2+显着提高了地理性能

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有过滤器匹配的Elasticsearch聚合

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

来自分类Dev

具有过滤器的弹性搜索聚合无法过滤聚合

来自分类Dev

Excel数据透视表-具有过滤器维的日期范围过滤器

来自分类Dev

具有排序查询建模的 Cassandra 过滤器

来自分类Dev

PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

来自分类Dev

弹性搜索 更像这个带有过滤器的查询是添加结果

来自分类Dev

如何使用@>运算符构建具有过滤器的sqlalchemy查询?

来自分类Dev

具有过滤器的C#中的MongoDB Linq查询

来自分类Dev

雄辩的带有过滤器的复杂查询

来自分类Dev

Web API $ extend具有过滤器的IQueryable

来自分类Dev

如何在Django中编写查询以连接三个具有过滤器和按条件排序的表

来自分类Dev

无效的过滤器:每个查询仅一个属性可以具有不等式过滤器(> =,<=,>,<)

来自分类Dev

带有过滤器的GetPivotData

来自分类Dev

带有过滤器的mdChips

来自分类Dev

查询数据框,但仅将过滤器应用于列值不是NaN的行

来自分类Dev

Elasticsearch在没有过滤器的未分析字段上聚合术语

来自分类Dev

在弹性搜索中使用带有过滤器的聚合

来自分类Dev

ElasticSearch 6 中带有过滤器的嵌套对象的聚合

来自分类Dev

弹性搜索:具有聚合功能的ngram过滤器

来自分类Dev

SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

来自分类Dev

Wagtail / Django:查询过滤器仅返回用户具有访问权限的页面?

来自分类Dev

两个sqlalchemy查询返回相同的结果,即使它们具有不同的过滤器

来自分类Dev

Vega lite:具有两个带有单独过滤器的单独数据集

来自分类Dev

数据过滤器显示没有过滤条件

来自分类Dev

数据过滤器显示没有过滤条件

来自分类Dev

Primefaces具有数据表,overlayPanel和过滤器/排序的怪异行为

Related 相关文章

  1. 1

    具有过滤器匹配的Elasticsearch聚合

  2. 2

    带有过滤器的Spring数据ElastiSearch聚合

  3. 3

    带有过滤器的Spring数据ElastiSearch聚合

  4. 4

    带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

  5. 5

    具有过滤器的弹性搜索聚合无法过滤聚合

  6. 6

    Excel数据透视表-具有过滤器维的日期范围过滤器

  7. 7

    具有排序查询建模的 Cassandra 过滤器

  8. 8

    PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

  9. 9

    弹性搜索 更像这个带有过滤器的查询是添加结果

  10. 10

    如何使用@>运算符构建具有过滤器的sqlalchemy查询?

  11. 11

    具有过滤器的C#中的MongoDB Linq查询

  12. 12

    雄辩的带有过滤器的复杂查询

  13. 13

    Web API $ extend具有过滤器的IQueryable

  14. 14

    如何在Django中编写查询以连接三个具有过滤器和按条件排序的表

  15. 15

    无效的过滤器:每个查询仅一个属性可以具有不等式过滤器(> =,<=,>,<)

  16. 16

    带有过滤器的GetPivotData

  17. 17

    带有过滤器的mdChips

  18. 18

    查询数据框,但仅将过滤器应用于列值不是NaN的行

  19. 19

    Elasticsearch在没有过滤器的未分析字段上聚合术语

  20. 20

    在弹性搜索中使用带有过滤器的聚合

  21. 21

    ElasticSearch 6 中带有过滤器的嵌套对象的聚合

  22. 22

    弹性搜索:具有聚合功能的ngram过滤器

  23. 23

    SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

  24. 24

    Wagtail / Django:查询过滤器仅返回用户具有访问权限的页面?

  25. 25

    两个sqlalchemy查询返回相同的结果,即使它们具有不同的过滤器

  26. 26

    Vega lite:具有两个带有单独过滤器的单独数据集

  27. 27

    数据过滤器显示没有过滤条件

  28. 28

    数据过滤器显示没有过滤条件

  29. 29

    Primefaces具有数据表,overlayPanel和过滤器/排序的怪异行为

热门标签

归档