Гео-запрос Elasticsearch с агрегацией - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть индекс эластичного поиска, содержащий местоположения пользователей. Мне нужно выполнить агрегированный запрос с помощью гео-ограничительной рамки, используя сетку geoha sh, а для корзин, в которых количество документов меньше некоторого значения, мне нужно вернуть все документы.

Как я могу это сделать?

1 Ответ

0 голосов
/ 09 апреля 2020

Поскольку вы не предоставили никакой соответствующей информации о созданном вами индексе и расположениях пользователей.

Я рассматриваю следующие данные:

Индекс Def

{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}   

Индекс Образец Do c

POST _bulk

{"index":{"_id":1}}
{"location":"52.37408,4.912350","name":"The golden dragon"}
{"index":{"_id":2}}
{"location":"52.369219,4.901618","name":"Burger King"}
{"index":{"_id":3}}
{"location":"52.371667,4.914722","name":"Wendys"}
{"index":{"_id":4}}
{"location":"51.222900,4.405200","name":"Taco Bell"}
{"index":{"_id":5}}
{"location":"48.861111,2.336389","name":"McDonalds"}
{"index":{"_id":6}}
{"location":"48.860000,2.327000","name":"KFC"}

По вашему вопросу:

При запросе подробных интервалов следует использовать фильтр типа geo_bounding_box, чтобы сузить предметную область

Чтобы узнать больше об этом, вы можете обратиться к этому официальному ES do c

  • Теперь, чтобы отфильтровать данные на основе doc_count с агрегациями, мы можем использовать bucket_selector конвейерная агрегация.

С документация

Конвейерные агрегации работают с выходами, полученными из других агрегатов, а не из наборов документов, добавляя информацию в дерево вывода.

Итак, количество работа, которую необходимо выполнить для расчета doc_count, будет такой же.

* 104 4 * Запрос
    {
  "aggs": {
    "location": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 52.5225,
              "lon": 4.5552
            },
            "bottom_right": {
              "lat": 52.2291,
              "lon": 5.2322
            }
          }
        }
      },
      "aggs": {
        "around_amsterdam": {
          "geohash_grid": {
            "field": "location",
            "precision": 8
          },
          "aggs": {
            "the_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "the_doc_count": "_count"
                },
                "script": "params.the_doc_count < 2"
              }
            }
          }
        }
      }
    }
  }
}

Результат поиска

"hits": {
    "total": {
      "value": 6,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "location": "52.37408,4.912350",
          "name": "The golden dragon"
        }
      },
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "location": "52.369219,4.901618",
          "name": "Burger King"
        }
      },
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "location": "52.371667,4.914722",
          "name": "Wendys"
        }
      },
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "4",
        "_score": 1.0,
        "_source": {
          "location": "51.222900,4.405200",
          "name": "Taco Bell"
        }
      },
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "5",
        "_score": 1.0,
        "_source": {
          "location": "48.861111,2.336389",
          "name": "McDonalds"
        }
      },
      {
        "_index": "restaurant",
        "_type": "_doc",
        "_id": "6",
        "_score": 1.0,
        "_source": {
          "location": "48.860000,2.327000",
          "name": "KFC"
        }
      }
    ]
  },
  "aggregations": {
    "location": {
      "doc_count": 3,
      "around_amsterdam": {
        "buckets": [
          {
            "key": "u173zy3j",
            "doc_count": 1
          },
          {
            "key": "u173zvfz",
            "doc_count": 1
          },
          {
            "key": "u173zt90",
            "doc_count": 1
          }
        ]
      }
    }
  }
}

Отфильтрует все документы, количество которых меньше 2 на основе на "params.the_doc_count < 2"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...