elasticsearch,distance,Php,Search,elasticsearch,Distance" /> elasticsearch,distance,Php,Search,elasticsearch,Distance" />

Php 如何使用Elasticsearch将过滤器与搜索距离结合起来?

Php 如何使用Elasticsearch将过滤器与搜索距离结合起来?,php,search,elasticsearch,distance,Php,Search,elasticsearch,Distance,我有一个elasticsearch问题: 下面是我的映射: { "9849asdasprofiles" : { "mappings" : { "profile" : { "properties" : { "activity" : { "type" : "long" }, "address" : { "type" : "string" }, "cPerson" : {

我有一个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条目,我只想获得具有已定义ID的条目。ID位于一个数组中。过滤完这些项目后,我想进行距离搜索。所以我在下面运行了这个查询:

{
    "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"
    ]
}
问题是:结果包含具有指定ID的条目,但距离过滤器不会影响结果


关于如何做到这一点有什么想法吗?

好的,我明白了:解决方案非常简单。我只需将过滤器部分(在PHP中)从

但我在elastisearch文档中找不到这个部分…:(

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