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

ElasticSearch按地理位置筛选,带值或空值

汝和裕
2023-03-14

我正在将业务添加到ElasticSearch中。有些是地理位置(lon、lat坐标),有些是在线业务(没有坐标)。

GET /organizations/_search
{
  "query": {
    "bool" : {
      "must_not": {
        "exists": {
          "field": "geocoords"
        }
      },
      "filter" : {
        "geo_distance" : {
          "distance" : "200km",
          "geocoords" : {
            "lon": -73.57,
            "lat": 45.45
          }
        }
      }
    }
  }
}
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

这是我掌握的数据:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "organizations",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "is_active" : true,
          "name": "Compagny Inc.",
          "geocoords" : {
            "lon" : -73.5761003,
            "lat" : 45.4560316
          }
        }
      }
    ]
  }
}

有什么建议吗?谢谢你。

共有1个答案

黄聪
2023-03-14

当前查询是互斥的--首先筛选出有效的coord,然后执行径向搜索。

相反,您可能需要一个逻辑OR--要么在半径中,要么根本不需要COORD:

GET organizations/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": {
              "geo_distance": {
                "distance": "200km",
                "geocoords": {
                  "lon": -73.57,
                  "lat": 45.45
                }
              }
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "geocoords"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
 类似资料:
  • 问题内容: 假设我要按第10到20个百分点内的某个字段过滤文档。我想知道是否可以通过一些简单的查询(例如)进行查询。 说我有这些文件: 我需要按(升序) 从前10位到第10位进行过滤,然后按降序对结果进行排序,然后进行分页(如第2页,第10页)每页的项目)。 想到的一种解决方案是: 获取文件总数。 将文档按排序,取对应的限制 写最终查询,像 但是缺点也很明显: 如果我们谈论的是亚秒级延迟,则似乎效

  • 我在Web API项目中使用NEST时遇到了一个问题,因为它是按Geo距离排序的。我有: 与Elasticsearch v5.1.1服务器(工作良好) 简单。安装了NEST v5.0.1的NET Web Api应用程序(基本的CRUD和搜索操作运行良好) 昨天,我决定实施地理距离排序,但所有可能的解决方案都导致我在搜索/排序请求中出现此异常: 从POST:/activities/activity/

  • 本文向大家介绍C ++中的按位筛选,包括了C ++中的按位筛选的使用技巧和注意事项,需要的朋友参考一下 在这个问题中,给我们一个数字N。我们的任务是使用按位筛选找到所有小于N的素数。 按位筛是Eratosthenes筛的优化版本,用于查找所有小于给定数的素数。 让我们举个例子来了解这个问题, 输入-N = 25 输出-2 3 5 7 11 13 17 19 23 按位筛子的工作方式与普通筛子相同。

  • 我正在尝试按位置displayName筛选所有事件。由于location是一个复杂的属性,displayName是嵌套的,因此我需要有关如何执行此操作的帮助。我试过以下方法,但都没有成功。 https://graph.microsoft.com/v1.0/me/events?$expand=位置($filter=displayName eq‘东会议室’) https://graph.microso

  • null 我也尝试使用scripted_field,但是脚本字段似乎是在最后一个阶段计算的,在查询过程中不可用。 我也有一个按照相同逻辑进行排序的方法(根据给定仓库中库存的总和对产品进行排序),它像一个魅力一样工作: 但我也找不到访问此排序值的方法:(

  • 好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?