【问题标题】:NEST 2.0 with Elasticsearch for GeoDistance always returns all records带有 Elasticsearch for GeoDistance 的 NEST 2.0 始终返回所有记录
【发布时间】:2016-07-01 01:08:08
【问题描述】:

我通过 nuget 使用 C# .NET 4.5 和 NEST 2.0 获得以下代码。此查询始终返回我的类型“trackpointes”以及具有此距离搜索代码的文档总数。我有 2,790 个文档,计数返回就是这样。即使将 1 厘米作为距离单位,它也会返回所有 2,790 个文档。我的“trackpointes”类型有一个位置字段、geo_point 类型、geohash true 和 geohash_precision 9。

我只是尝试根据距离过滤结果,而不使用任何其他搜索词,对于我的 2,790 条记录,无论测量单位如何,它都会返回它们。所以我必须遗漏一些东西(希望很小)。任何帮助表示赞赏。我能找到的 NEST 示例已有一两年的历史,而且该语法似乎不再适用。

double distance = 4.0;
var geoResult = client.Search<TrackPointES>(s => s.From(0).Size(10000).Type("trackpointes")
    .Query(query => query
    .Bool( b => b.Filter(filter => filter
                .GeoDistance(geo => geo
                .Distance(distance, Nest.DistanceUnit.Kilometers).Location(35, -82)))
             )
           )
       );

如果我使用 POSTMAN 连接到我的 ES 实例并使用以下 JSON 发布搜索,我会在 2,790 个文档中返回 143 个文档。所以我知道数据是正确的,因为这是一个现实的回报。

{
"query" : {
    "filtered" : {
        "filter" : {
            "geo_distance" : {
                "distance" : "4km",
                "location" : {
                    "top_left": {
                        "lat" : 35,
                        "lon" : -82
                    }
                }
            }
        }
    }
  }
}

【问题讨论】:

  • 您可能需要考虑使用扫描和滚动来返回 10,000 个结果(可能一次 500 个),而不是要求 Elasticsearch 在一个请求中将它们全部返回给您;它可能会给您的集群带来更少的压力 - elastic.co/guide/en/elasticsearch/reference/current/…

标签: elasticsearch nest geo


【解决方案1】:

看起来您没有在查询中指定字段。试试这个:

var geoResult = client.Search<Document>(s => s.From(0).Size(10000)
    .Query(query => query
        .Bool(b => b.Filter(filter => filter
            .GeoDistance(geo => geo
                .Field(f => f.Location) //<- this 
                .Distance(distance, Nest.DistanceUnit.Kilometers).Location(35, -82)))
        )
    )
    );

【讨论】:

  • 就是这样,我很欣赏@Rob 的回复。我还不能 +1,但如果可以的话,我会的。
【解决方案2】:

我忘记指定搜索位置的字段。 :(但我在这里发帖是为了以防其他人有同样的问题,并羞辱自己更加努力......

.Field(p => p.location) 是查询中的差异。

        var geoResult = client.Search<TrackPointES>(s => s.From(0).Size(10000).Type("trackpointes")
          .Query(query => query
           .Bool( b => b.Filter(filter => filter
                .GeoDistance(geo => geo.Field(p => p.location).DistanceType(Nest.GeoDistanceType.SloppyArc)
                .Distance(distance, Nest.DistanceUnit.Kilometers).Location(35, -82)))
             )
           )
       );

【讨论】:

  • 不会撒谎。我刚刚做了同样的事情;谢谢你的提问和回答?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2015-03-13
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多