QueryParsingException[[mobapp] не удалось найти поле geo_point [location.position]

Я создал индекс, используя:

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();    

я получаю QueryParsingException[[mobapp] failed to find geo_point field [location.position]]; }

1 ответ

Решение

Если вы хотите сохранить только данные о вашем местоположении, вам не нужно использовать 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 а затем воссоздайте его с помощью приведенной выше команды и переиндексируйте ваши данные. Ваш запрос должен работать позже.

Другие вопросы по тегам