elasticsearch 响应中缺少 geo_point 个字段
Missing geo_point fields in elasticsearch response
如果使用 "fields []"
指定,结果中似乎会忽略 geo_point 字段
我有索引 test01 的以下映射
{
"test01": {
"mappings": {
"activity": {
"properties": {
"location": {
"type": "string"
},
"mygeo": {
"type": "geo_point",
"doc_values": true,
"fielddata": {
"format": "compressed",
"precision": "1km"
}
}
}
}
}
}
}
索引包含单个 activity
{
"mygeo": {
"lat": 51.247607909,
"lon": 22.565701278
},
"location" : "New York"
}
查询
GET /test01/_search
{
"size" : 1,
"fields": ["location", "mygeo"]
}
在缺少 mygeo 字段的地方生成以下内容。 (我也尝试过 "fields":["location"、"mygeo.lat"、"mygeo.lon"、"mygeo"]。
"hits": [
{
"_index": "test01",
"_type": "activity",
"_id": "1",
"_score": 1,
"fields": {
"location": [
"New York"
]
}
}
]
我可以获得 mygeo 对象的唯一方法是通过添加“_source”通过 _source : {"includes" : [ "mygeo" ]}.
有什么方法可以使用 "field" 参数获取 geo_point 字段吗?
我试过 Rest API 和 Java API。两者使用 Elasticsearch v. 1.7.1 产生相同的结果。
谢谢
所以按照这个逻辑,我通过将 "store": true
添加到您的索引映射来复制并解决了这个问题,现在它允许我使用 fields
检索 lon/lat,而不是_source
.
请查看在我的本地主机上 Sense 上完成的复制:
DELETE test
PUT /test
{
"mappings": {
"test1": {
"properties": {
"location": {
"type": "string"
},
"mygeo": {
"type": "geo_point",
"doc_values": true,
"store": true,
"fielddata": {
"format": "compressed",
"precision": "1km"
}
}
}
}
}
}
POST /test/test1/
{
"mygeo": {
"lat": 51.247607909,
"lon": 22.565701278
},
"location": "New York"
}
GET /test/_search
{
"size" : 1,
"fields": ["location", "mygeo"]
}
因此,此查询确实返回了您预期的结果。唯一的问题是您的 lan/lon 被格式化为数组。查看查询结果:
{
"hits" : [{
"_index" : "test",
"_type" : "test1",
"_id" : "AVCGqhsq9y2W0mh1rPgV",
"_score" : 1,
"fields" : {
"mygeo" : [
"51.247607909,22.565701278"
],
"location" : [
"New York"
]
}
}
]
}
但是,这是 Elasticsearch 官方支持的格式之一。摘自 documentation:
With the location field defined as a geo_point, we can proceed to
index documents containing latitude/longitude pairs, which can be
formatted as strings, arrays, or objects:
PUT /attractions/restaurant/1
{
"name" : "Chipotle Mexican Grill",
"location" : "40.715, -74.011"
}
PUT /attractions/restaurant/2
{
"name" : "Pala Pizza",
"location" : {
"lat" : 40.722,
"lon" : -73.989
}
}
PUT /attractions/restaurant/3
{
"name" : "Mini Munchies Pizza",
"location" : [-73.983, 40.719]
}
此外,请注意文档中的这一点:
Everybody gets caught at least once: string geo-points are
"latitude,longitude", while array geo-points are
[longitude,latitude]—the opposite order!
如果您的字段存储在 _source 中(即使它是 GeoPoint 类型字段),您必须使用“_source”查询参数来指定您想要哪些字段(来自源):
GET /_search
{
"_source": "obj.*",
"query" : {
"term" : { "user" : "kimchy" }
}
}
在此处查看更多详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html
长话短说:
- 如果您的字段在源中,那么您需要在查询中指定“_source”模式以仅获取您想要的部分(字段)
- 在您的查询中指定 "fields" 将(大部分)对在映射中使用 "store: yes" 声明的字段有意义。这并没有说明哪些字段应该 return 从源中编辑。
- 是的,这里存在不一致:如果您的字段映射到源中,但未使用 "Store: yes" 声明,则在查询的 "fields" 参数中指定它可能会也可能不会 return 它(我注意到 "simple" 字段,如文本、数字等在这种情况下被 returned,但更复杂的字段,如时间戳或 GeoPoint 则没有)。
如果使用 "fields []"
指定,结果中似乎会忽略 geo_point 字段我有索引 test01 的以下映射
{
"test01": {
"mappings": {
"activity": {
"properties": {
"location": {
"type": "string"
},
"mygeo": {
"type": "geo_point",
"doc_values": true,
"fielddata": {
"format": "compressed",
"precision": "1km"
}
}
}
}
}
}
}
索引包含单个 activity
{
"mygeo": {
"lat": 51.247607909,
"lon": 22.565701278
},
"location" : "New York"
}
查询
GET /test01/_search
{
"size" : 1,
"fields": ["location", "mygeo"]
}
在缺少 mygeo 字段的地方生成以下内容。 (我也尝试过 "fields":["location"、"mygeo.lat"、"mygeo.lon"、"mygeo"]。
"hits": [
{
"_index": "test01",
"_type": "activity",
"_id": "1",
"_score": 1,
"fields": {
"location": [
"New York"
]
}
}
]
我可以获得 mygeo 对象的唯一方法是通过添加“_source”通过 _source : {"includes" : [ "mygeo" ]}.
有什么方法可以使用 "field" 参数获取 geo_point 字段吗?
我试过 Rest API 和 Java API。两者使用 Elasticsearch v. 1.7.1 产生相同的结果。
谢谢
所以按照这个逻辑,我通过将 "store": true
添加到您的索引映射来复制并解决了这个问题,现在它允许我使用 fields
检索 lon/lat,而不是_source
.
请查看在我的本地主机上 Sense 上完成的复制:
DELETE test
PUT /test
{
"mappings": {
"test1": {
"properties": {
"location": {
"type": "string"
},
"mygeo": {
"type": "geo_point",
"doc_values": true,
"store": true,
"fielddata": {
"format": "compressed",
"precision": "1km"
}
}
}
}
}
}
POST /test/test1/
{
"mygeo": {
"lat": 51.247607909,
"lon": 22.565701278
},
"location": "New York"
}
GET /test/_search
{
"size" : 1,
"fields": ["location", "mygeo"]
}
因此,此查询确实返回了您预期的结果。唯一的问题是您的 lan/lon 被格式化为数组。查看查询结果:
{
"hits" : [{
"_index" : "test",
"_type" : "test1",
"_id" : "AVCGqhsq9y2W0mh1rPgV",
"_score" : 1,
"fields" : {
"mygeo" : [
"51.247607909,22.565701278"
],
"location" : [
"New York"
]
}
}
]
}
但是,这是 Elasticsearch 官方支持的格式之一。摘自 documentation:
With the location field defined as a geo_point, we can proceed to index documents containing latitude/longitude pairs, which can be formatted as strings, arrays, or objects:
PUT /attractions/restaurant/1 { "name" : "Chipotle Mexican Grill", "location" : "40.715, -74.011" } PUT /attractions/restaurant/2 { "name" : "Pala Pizza", "location" : { "lat" : 40.722, "lon" : -73.989 } } PUT /attractions/restaurant/3 { "name" : "Mini Munchies Pizza", "location" : [-73.983, 40.719] }
此外,请注意文档中的这一点:
Everybody gets caught at least once: string geo-points are "latitude,longitude", while array geo-points are [longitude,latitude]—the opposite order!
如果您的字段存储在 _source 中(即使它是 GeoPoint 类型字段),您必须使用“_source”查询参数来指定您想要哪些字段(来自源):
GET /_search
{
"_source": "obj.*",
"query" : {
"term" : { "user" : "kimchy" }
}
}
在此处查看更多详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html
长话短说:
- 如果您的字段在源中,那么您需要在查询中指定“_source”模式以仅获取您想要的部分(字段)
- 在您的查询中指定 "fields" 将(大部分)对在映射中使用 "store: yes" 声明的字段有意义。这并没有说明哪些字段应该 return 从源中编辑。
- 是的,这里存在不一致:如果您的字段映射到源中,但未使用 "Store: yes" 声明,则在查询的 "fields" 参数中指定它可能会也可能不会 return 它(我注意到 "simple" 字段,如文本、数字等在这种情况下被 returned,但更复杂的字段,如时间戳或 GeoPoint 则没有)。