[英]How to combine a filter with distance for a search using Elasticsearch?
I have a elasticsearch question: 我有一个elasticsearch问题:
Here is my mapping below: 这是我在下面的映射:
{
"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"
}
}
}
}
}
}
For db-entries in the mapping above I want to get only the entries with defined IDs. 对于上面映射中的数据库条目,我只想获取具有已定义ID的条目。 The IDs are in an array. 这些ID在一个数组中。 After filtering These items, then I want to run a distance search. 过滤这些项目后,然后我要进行距离搜索。 So I ran this query below: 所以我在下面运行了这个查询:
{
"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"
]
}
The problem is: The result contains entries with the specified IDs, but the distance filter doesn't affect the results. 问题是:结果包含具有指定ID的条目,但是距离过滤器不会影响结果。
Any Ideas as to how to do this? 有关如何执行此操作的任何想法?
Ok, I got it: The solution was really simple. 好的,我明白了:解决方案非常简单。 I only had to change the filter part (in PHP) from 我只需要更改过滤器部分(在PHP中)
$params['body']['query']['function_score']['query']['bool']['filter']
to 至
$params['body']['query']['function_score']['filter']
But I couldn't find that part in the elastisearch documentation... :( 但是我在elastisearch文档中找不到那部分... :(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.