QueryParsingException [[mobapp]无法找到geo_point字段[location.position]

时间:2015-09-24 18:47:42

标签: elasticsearch elasticsearch-java-api

我使用:

创建了索引
offload-threads = X

我有这个索引

curl -XPUT localhost:9200/mobapp -d '{
  "mappings": {
    "publish_messages": {
      "properties": {
        "title": {
          "type": "string"
        },
        "location": {
          "type": "nested",
          "position": {
            "type": "geo_point"
          },
          "name": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "city": {
            "type": "integer"
          }
        },
        "time": {
          "type": "date",
          "format": "dd-MM-YYYY"
        }
      }
    }
  }
}'

我正在尝试执行此查询:

  "hits": [
    {
      "_index": "mobapp",
      "_type": "publish_messages",
      "_id": "184123e0-6123-11e5-83d5-7bdc2a9aa3c7",
      "_score": 1,
      "_source": {
        "title": "Kolkata rocka",
        "tags": [
          "Tag5",
          "Tag4"
        ],
        "date": "2015-09-22T12:11:46.335Z",
        "location": {
          "position": {
            "lat": 11.81776,
            "lon": 10.9376
          },
          "country": "India",
          "locality": "Bengaluru",
          "sublocality_level_1": "Koramangala"
        }
      }
    }
  ]

我正在 FilterBuilder filter = geoDistanceFilter("location") .point(lat, lon) .distance(distanceRangeInkm, DistanceUnit.KILOMETERS) .optimizeBbox("memory") .geoDistance(GeoDistance.ARC); FilterBuilder boolFilter = boolFilter() .must(termFilter("tags", tag)) .must(filter); GeoDistanceSortBuilder geoSort = SortBuilders.geoDistanceSort("location").point(lat, lon).order(SortOrder.ASC); SearchResponse searchResponse = client.prepareSearch(AppConstants.ES_INDEX) .setTypes("publish_messages") .addSort("time", SortOrder.DESC) .addSort(geoSort) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setPostFilter(boolFilter) .setFrom(startPage).setSize(AppConstants.DEFAULT_PAGINATION_SIZE) .execute() .actionGet();

1 个答案:

答案 0 :(得分:0)

如果您只想将位置数据保存在一起,则无需使用nested类型,只需使用普通object类型(即默认值),如下所示:

curl -XPUT localhost:9200/mobapp -d '{
  "mappings": {
    "publish_messages": {
      "properties": {
        "title": {
          "type": "string"
        },
        "location": {
          "type": "object",        <--- use object here
          "properties": {          <--- and don't forget properties here
            "position": {
              "type": "geo_point"
            },
            "name": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "city": {
              "type": "integer"
            }
          }
        },
        "time": {
          "type": "date",
          "format": "dd-MM-YYYY"
        }
      }
    }
  }
}'

请注意,您首先需要使用curl -XDELETE localhost:9200/mobapp清除当前索引,然后使用上述命令重新创建它并重新索引数据。您的查询应该可以在之后使用。