如何使用 Elasticsearch 将过滤器与距离相结合以进行搜索


How to combine a filter with distance for a search using 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"
      }
    }
      }
    }
  }
}

对于上面映射中的数据库条目,我只想获取具有已定义 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 中(从

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

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

但是我在弹性搜索文档中找不到那部分... :(