Запрос Elasticsearch для значений, которые существуют в нескольких географических местоположениях - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть индекс с документами, которые выглядят следующим образом:

{
    "name": "some name",
    "location: { "type": "Point", "coordinates": [3.295, 6.673]}
}

Я могу выполнить запрос геополигона без проблем.Но теперь я хочу найти два геополигона и вернуть только те документы, которые имеют одинаковое значение «name» в обоих.Таким образом, если «имя»: «Джейсон Смит» существует в обоих геополигонах, то эти документы будут возвращены.Но если «Джейсон Смит» существует только в одном, то он не будет возвращен.Я не могу понять, как написать этот запрос, поэтому любая помощь будет принята с благодарностью.

Вот запрос, с которым я работаю сейчас:

{
    "query":{
        "bool":{
            "filter":{
                "bool":{
                    "should":[
                        {"geo_distance": {"coordinates":[32.4809, 12.0422],"distance": "100 m"}},
                        {"geo_distance": {"coordinates":[33.4827, 13.0438],"distance": "100 m"}}
                    ]
                }
            }
        }
    },
    "aggs":{
        "found":{
            "terms":{
                "field": "name"
            }
        }
    }
}

Я пробовал оба«должен» и «должен».Должен возвращать только те документы, которые имеют координаты широта / долгота в обеих областях, а должен возвращать все документы из обеих областей.Мне нужен запрос для возврата документов, которые имеют одинаковое «имя» в обеих областях, а не координаты.

1 Ответ

0 голосов
/ 07 декабря 2018

Хорошо, поэтому я отредактировал.Должно работать, мы аггим по имени, затем по зоне, используя один из запрошенных аэровПосле публикации агрегации фильтра с помощью bucket_selector, _bucket_count получает размер массива подаггеоагрегатов, и поэтому, если его размер равен == 2, имя находится в обеих областях.Пожалуйста, скажите мне, если это работает;)

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "should": [
            {
              "geo_distance": {
                "coordinates": {
                  "lat": 48.858837,
                  "lon": 2.27702
                },
                "distance": "10km"
              }
            },
            {
              "geo_distance": {
                "coordinates": {
                  "lat": 40.697149,
                  "lon": -74.2598
                },
                "distance": "10km"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "found": {
      "terms": {
        "field": "name",
        "min_doc_count": 2
      },
      "aggs": {
        "subagggeo": {
          "geo_distance": {
            "field": "coordinates",
            "origin": "48.858837, 2.27702",
            "unit": "m",
            "ranges": [
              {
                "to": 10000
              },
              {
                "from": 10001
              }
            ]
          }
        },
        "min_bucket_selector": {
      "bucket_selector": {
        "buckets_path": {
          "hits": "subagggeo._bucket_count"
        },
        "script": {
          "inline": "params.hits > 1"
        }
      }
    }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...