Фильтр Elasticsearch по нескольким точкам geo_points с разным весом - PullRequest
0 голосов
/ 01 января 2019

У меня есть ряд документов, с которыми, кроме других полей, связано количество geo_point s.Я хочу найти все документы, которые связаны с конкретным городом.Для этого у меня также есть индекс городов, я сначала ищу его и получаю список координат с _score s из этого поиска.Теперь я хочу передать эти данные в поиск документов и умножить оценку найденных документов на соответствующую оценку города.

Предполагая, что первый запрос возвращает список кортежей типа [(city_coords, city_score), (...)], я хочу построитьзапросить индекс документа, используя function_score и массив functions, где каждый город является отдельной функцией с отдельной оценкой.

Однако, когда я строю запрос в его простейшей форме, он выбирает все документы в моем индексе.Вот какой запрос я сделал:

{
    'query': {
        'function_score': {
            'functions': [
                {
                    "filter": {
                        "geo_distance": {
                            "distance": "1km",
                            "distance_type": "plane",
                            "points": city_coords
                        },
                    },
                    'weight': city_score
                }
            ]
        }
    }
}

Я что-то упустил?Как получить только документы, связанные с этим конкретным городом?

1 Ответ

0 голосов
/ 02 января 2019

Поскольку вы не указываете запрос в своей части function_score, Elastic принимает запрос match_all.Таким образом, он возвращает все документы и добавляет повышение для документов рядом с выбранными запросами.

Вы должны добавить определенный запрос в свою часть function_score, который отфильтрует любой документ, который находится недостаточно близко от выбранных городов.Что-то вроде

{
    "query": {
        "function_score": {
            "query": {
              "bool": {
                "should": [
                  {
                    "geo_distance": {
                        "distance": "1km",
                        "distance_type": "plane",
                        "points": city_coords1
                    }
                  },
                  {
                    "geo_distance": {
                        "distance": "1km",
                        "distance_type": "plane",
                        "points": city_coords2
                    }
                  },
                  ... and so on
                ]
              }
            },
            "functions": [
                {
                    "filter": {
                        "geo_distance": {
                            "distance": "1km",
                            "distance_type": "plane",
                            "points": city_coords
                        },
                    },
                    "weight": city_score
                }
            ]
        }
    }
}
...