2016-02-15 85 views
1

我有一个elasticsearch问题:如何结合使用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的条目,但距离过滤器不影响使用效果。

任何想法如何做到这一点?

回答

1

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

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

改变

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

但我找不到elastisearch文档中的一部分... :(

相关问题