У меня есть индекс со следующим отображением:
{
"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')