Elasticsearch "не удалось найти поле geo_point [местоположение]", когда для этого поля существует сопоставление - PullRequest
0 голосов
/ 27 мая 2018

У меня есть индекс со следующим отображением:

{
  "mappings":{
    "my_stuff_type":{
      "properties":{
        "location": {
          "type": "geo_point",
          "null_value": -1
        }
      }
    }
  }
}

Мне нужно использовать свойство null_value, потому что некоторые из моих документов не содержат информации об их местонахождении (широта / долгота), ноЯ все еще хотел бы искать по местоположению, ср.здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/null-value.html

При проверке деталей отображения индекса, я могу убедиться, что географическое отображение есть:

curl -XGET http://localhost:9200/my_stuff_index/_mapping | jq '.my_stuff_index.mappings.my_stuff_type.properties.location'
{
  "properties": {
    "lat": {
      "type": "float"
    },
    "lon": {
      "type": "float"
    }
  }
}

Однако при попытке поиска документов по этому индексу с использованием геоФильтр расстояния (см. https://www.elastic.co/guide/en/elasticsearch/guide/current/geo-distance.html),, тогда я вижу это:

curl -XPOST http://localhost:9200/my_stuff_index/_search -d'
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "location": {
            "lat": <PUT_LATITUDE_FLOAT_HERE>,
            "lon": <PUT_LONGITUDE_FLOAT_HERE>
          },
          "distance": "200m"
        }
      }
    }
  }
}' | jq

{
  "error": {
    "root_cause": [
      {
        "type": "query_shard_exception",
        "reason": "failed to find geo_point field [location]",
        "index_uuid": "mO94yEsHQseQDFPkHjM6tA",
        "index": "my_stuff_index"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "my_stuff_index",
        "node": "MDueSn31TS2z0Lamo64zbw",
        "reason": {
          "type": "query_shard_exception",
          "reason": "failed to find geo_point field [location]",
          "index_uuid": "mO94yEsHQseQDFPkHjM6tA",
          "index": "my_stuff_index"
        }
      }
    ],
    "caused_by": {
      "type": "query_shard_exception",
      "reason": "failed to find geo_point field [location]",
      "index_uuid": "mO94yEsHQseQDFPkHjM6tA",
      "index": "my_stuff_index"
    }
  },
  "status": 400
}

Я думаю, что свойство null_value должно позволять мне вставлять документы без поданной location и в то же время ядолжен иметь возможность выполнять поиск с помощью фильтров в том же «дополнительном» поле.

Почему я не могу фильтровать в этом «дополнительном» поле? Как я могу это сделать?

Редактировать:

Чтобы воспроизвести эту проблему с python, перед выполнением операций curl / jq из командной строки выполните следующий фрагмент кода.

Код Python зависит отэто: pip install elasticsearch==5.4.0.

from elasticsearch import Elasticsearch
from elasticsearch import helpers

my_docs = [
    {"xyz": "foo", "location": {"lat": 0.0, "lon": 0.0}},
    {"xyz": "bar", "location": {"lat": 50.0, "lon": 50.0}}
]

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

index_mapping = '''
{
  "mappings":{
    "my_stuff_type":{
      "properties":{
        "location": {
          "type": "geo_point",
          "null_value": -1.0
        }
      }
    }
  }
}'''

es.indices.create(index='my_stuff_index', ignore=400, body=index_mapping)

helpers.bulk(es, my_docs, index='my_stuff_index', doc_type='my_stuff_type')

1 Ответ

0 голосов
/ 30 мая 2018

как сказал @Val, вы должны изменить свое отображение.Если вы определяете поле местоположения следующим образом:

    "location": {
      "type": "geo_point"
    }

, вы можете индексировать lan и lon как два разных подполя - без объявления их в отображении, как я показал - как описано в документации - смотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...