elasticsearch-php多范围查询不起作用

时间:2016-05-24 09:35:27

标签: php elasticsearch

我正在使用弹性搜索的客户端client for elasticsearch,我无法获得多范围查询的正确结果。

我用来查询的身体:

{  
   "index":"locations",
   "type":"portugal",
   "body":{  
      "aggs":{  
         "unique":{  
            "aggs":{  
               "documents":{  
                  "top_hits":{  
                     "size":50
                  }
               }
            },
            "terms":{  
               "field":"cp3"
            }
         }
      },
      "query":{  
         "filtered":{  
            "filter":{  
               "bool":{  
                  "must":{  
                     "range":{  
                        "latitude":{  
                           "gte":41.1373667,
                           "lte":41.1373767
                        },
                        "longitude":{  
                           "gte":-8.631723,
                           "lte":-8.631713
                        }
                     }
                  }
               }
            }
         }
      }
   }
}

结果:

{  
   "took":2,
   "timed_out":false,
   "_shards":{  
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{  
      "total":1,
      "max_score":1,
      "hits":[  
         {  
            "_index":"locations",
            "_type":"portugal",
            "_id":"AVTJ4I0g_vwSgXBDKO-W",
            "_score":1,
            "_source":{  
               "id":222956,
               "latitude":41.0383217,
               "longitude":-8.6317147
            }
         }
      ]
   },
   "aggregations":{  
      "unique":{  
         "doc_count_error_upper_bound":0,
         "sum_other_doc_count":0,
         "buckets":[  
            {  
               "key":199,
               "doc_count":1,
               "documents":{  
                  "hits":{  
                     "total":1,
                     "max_score":1,
                     "hits":[  
                        {  
                           "_index":"locations",
                           "_type":"portugal",
                           "_id":"AVTJ4I0g_vwSgXBDKO-W",
                           "_score":1,
                           "_source":{  
                              "id":222956,
                              "latitude":41.0383217,
                              "longitude":-8.6317147
                           }
                        }
                     ]
                  }
               }
            }
         ]
      }
   }
}

你可以看到结果的纬度不在我给它的纬度范围内。

使用elasticsearch的Head插件测试:

我的疑问:

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "range":{  
                  "latitude":{  
                     "gte":"41.1363671",
                     "lte":"41.1363771"
                  }
               }
            },
            {  
               "range":{  
                  "longitude":{  
                     "gt":"-8.6318828",
                     "lte":"-8.6318728"
                  }
               }
            }
         ],
         "must_not":[  

         ],
         "should":[  

         ]
      }
   },
   "from":0,
   "size":10,
   "sort":[  

   ],
   "aggs":{  

   }
}

结果:  (空),此范围内没有记录。

编辑: 添加了我的索引的映射:

{     
      "locations":{  
      "aliases":{  

      },
      "mappings":{  
         "portugal":{  
            "properties":{  
               "cp3":{  
                  "type":"long"
               },
               "cp4":{  
                  "type":"long"
               },
               "cpalf":{  
                  "type":"string"
               },
               "id":{  
                  "type":"long"
               },
               "latitude":{  
                  "type":"double"
               },
               "localidade":{  
                  "type":"string"
               },
               "longitude":{  
                  "type":"double"
               }
            }
         }
      },
      "settings":{  
         "index":{  
            "creation_date":"1463675755006",
            "number_of_shards":"5",
            "number_of_replicas":"1",
            "uuid":"C9OO0ig_QyeigqSufK8_dA",
            "version":{  
               "created":"2030199"
            }
         }
      },
      "warmers":{  

      }    
    } 
}

1 个答案:

答案 0 :(得分:1)

使用以下查询进行测试:

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "range":{  
                  "latitude":{  
                     "gte": 41.1363671,
                     "lte": 41.1363771
                  }
               }
            },
            {  
               "range":{  
                  "longitude":{  
                     "gt": -8.6318828,
                     "lte": -8.6318728
                  }
               }
            }
         ],
         "must_not":[  

         ],
         "should":[  

         ]
      }
   },
   "from":0,
   "size":10,
   "sort":[  

   ],
   "aggs":{  

   }
}

由于经度和纬度字段是double类型,因此应与double进行比较,但是您已经与字符串进行了比较。