【问题标题】:ElasticSearch .net GeoDistance filter not workingElasticSearch .net GeoDistance 过滤器不起作用
【发布时间】:2019-01-29 09:30:30
【问题描述】:

我创建的 Kibana 开发工具查询可以 100% 运行,并返回 10 公里距离范围内的结果。它的结构是这样的:

GET /catdb/_search
{
"query": {
    "bool" : {
        "must" : {
         "match_phrase": {
  "NAME": {
    "query": "cats",
        "slop": 3

  }
    }
        },
        "filter" : {
            "geo_distance" : {
                "distance" : "10km",
         "location":{
           "lat" : -25.859919,
            "lon" : 28.183966
                    }
            }
        }
    }
  }
 }

我在 C# 中使用 NEST 创建的查询结构相同,但返回的结果来自地理距离之外的远处

        var catsSearch = client.Search<dynamic>(s => s.From(0).Size(20).Query(
            q => q.Bool(
            b => b.Must(
                m => m.MatchPhrase(
                    n => n.Field("NAME").Query("cats").Slop(slop))).Filter(
                     f => f.GeoDistance(
                      g => g.Distance(10, DistanceUnit.Kilometers).Location(-25.859919, 28.183966))))));

我还尝试在位置过滤器中传递 GeoLocation 对象。 任何关于我可能做错了什么或如何调试的建议都将不胜感激。

【问题讨论】:

  • 看看客户端发送给 Elasticsearch 的内容:elastic.co/guide/en/elasticsearch/client/net-api/current/…
  • 粗略一看,索引和类型都没有指定:索引可能是使用ConnectionSettings上配置的默认索引,类型会从TSearch&lt;T&gt;(...)上推断出来。如果要搜索索引catdb中的所有类型,那么可以在请求中指定AllTypes()

标签: c# elasticsearch nest elasticsearch.net


【解决方案1】:

您没有指定 Geodistance 的字段:.Field(p=>p.Location)

【讨论】:

  • 在这种情况下如何指定字段?由于我使用动态
  • field("fieldname") NEST 无法自行猜测位置字段。如果您必须使用“通用”查询,解决方法可能是首先解析您的映射以获取位置字段名称并在您的查询中设置此名称。
  • 我尝试添加 n.Field("location") 但这不起作用,我也无法解析它,因为他们想动态添加和删除其他字段
  • 如果您不知道他们的位置字段名称,Nest 将无法工作。因此,您必须添加一个函数(并设置一个字典类型 - 我认为的字段名以避免在每个查询中搜索它)来解析您的类型映射以找到它(Client.GetMappings)。
  • 查看 Kibana Dev 请求,只需要将 .Field("location") 添加到 g =&gt; g lambda 传递到 GeoDistance
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2013-07-06
  • 2015-01-05
相关资源
最近更新 更多