Как совместить фильтр с расстоянием для поиска с помощью Elasticsearch?

У меня есть вопрос по поиску

Вот мое отображение ниже:

{
"9849asdasprofiles" : {
"mappings" : {
"profile" : {
"properties" : {
"activity" : {
"type" : "long"},
"address" : {
"type" : "string"},
"cPerson" : {
"type" : "string"},
"category_id" : {
"type" : "long"},
"city" : {
"type" : "string"},
"country" : {
"type" : "string"},
"created_at" : {
"properties" : {
"date" : {
"type" : "string"},
"timezone" : {
"type" : "string"},
"timezone_type" : {
"type" : "long"}
}
},
"editors" : {
"properties" : {
"__cloner__" : {
"type" : "object"},
"__initializer__" : {
"type" : "object"},
"__isInitialized__" : {
"type" : "boolean"}
}
},
"fax" : {
"type" : "string"},
"foto_url" : {
"type" : "string"},
"has_siegel" : {
"type" : "long"},
"has_upgrade" : {
"type" : "long"},
"hsnr" : {
"type" : "string"},
"id" : {
"type" : "long"},
"info_text" : {
"type" : "string"},
"location" : {
"type" : "geo_point",
"fielddata" : {
"format" : "compressed",
"precision" : "3m"}
},
"logo_url" : {
"type" : "string"},
"name" : {
"type" : "string"},
"phone" : {
"type" : "string"},
"published" : {
"type" : "boolean"},
"role_limit_article" : {
"type" : "boolean"},
"role_limit_clicktracking" : {
"type" : "boolean"},
"role_limit_contact_fax" : {
"type" : "boolean"},
"role_limit_contact_mail" : {
"type" : "boolean"},
"role_limit_contact_phone" : {
"type" : "boolean"},
"role_limit_contact_website" : {
"type" : "boolean"},
"role_limit_create_profile" : {
"type" : "boolean"},
"role_limit_events" : {
"type" : "boolean"},
"role_limit_following" : {
"type" : "boolean"},
"role_limit_gallery" : {
"type" : "boolean"},
"role_limit_images" : {
"type" : "boolean"},
"role_limit_info_fields" : {
"type" : "boolean"},
"role_limit_logo" : {
"type" : "boolean"},
"role_limit_messages" : {
"type" : "boolean"},
"role_limit_products" : {
"type" : "boolean"},
"role_limit_view_follower" : {
"type" : "boolean"},
"role_limit_visitors" : {
"type" : "boolean"},
"role_limit_visittracking" : {
"type" : "boolean"},
"siegel_url" : {
"type" : "string"},
"slug" : {
"type" : "string"},
"street" : {
"type" : "string"},
"upgrade_level" : {
"type" : "long"},
"upgrade_sort" : {
"type" : "integer"},
"visible" : {
"type" : "boolean"},
"website" : {
"type" : "string"},
"zipcode" : {
"type" : "string"}
}
}
}
}
}

Для db-записей в отображении выше я хочу получить только записи с определенными идентификаторами. Идентификаторы находятся в массиве. После фильтрации этих предметов, затем я хочу запустить поиск расстояния. Итак, я запустил этот запрос ниже:

{
"index": "9849asdasprofiles",
"type": "profile",
"size": 30,
"from": 0,
"body": {
"query": {
"function_score": {
"functions": [
{
"linear": {
"location": {
"origin": "48.136833417046,11.570900696682",
"offset": "2km",
"scale": "1km"}
}
}
],
"score_mode": "avg",
"boost_mode": "replace",
"query": {
"bool": {
"must": [
{
"term": {
"published": "1"}
},
{
"match": {
"country": "DE"}
}
],
"filter": {
"terms": {
"id": [
5336,
4955,
5488
]
}
}
}
}
}
},
"aggs": {
"rings": {
"geo_distance": {
"field": "location",
"origin": "48.136833417046,11.570900696682",
"distance_type": "arc",
"unit": "km",
"ranges": [
{
"to": 25
}
]
}
}
},
"script_fields": {
"distance": {
"lang": "groovy",
"params": {
"lat": 48.136833417046,
"lon": 11.570900696682
},
"script": "doc['location'].arcDistanceInKm(lat,lon)"}
},
"sort": [
{
"upgrade_sort": {
"order": "desc"}
},
{
"has_siegel": {
"order": "desc"}
},
{
"_geo_distance": {
"location": {
"lat": 48.136833417046,
"lon": 11.570900696682
},
"order": "asc",
"unit": "km"}
}
]
},
"fields": [
"_source",
"distance"]
}

проблема is: Результат содержит записи с указанными идентификаторами, но фильтр расстояний не влияет на результаты.

Любые идеи о том, как это сделать?

1

Решение

Хорошо, я понял: решение было действительно простым. Мне нужно было только изменить часть фильтра (в PHP) с

$params['body']['query']['function_score']['query']['bool']['filter']

в

$params['body']['query']['function_score']['filter']

Но я не смог найти эту часть в документации elastisearch … 🙁

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]