2013-08-06 3 views
2

Я создал эластичный индекс поиска, который включает в себя различные сопоставления _type для каждой страны.ElasticSearch _Type with geolocation

Так есть отображение для «нас», «аи», «ик» и т.д.

Каждого отображения включает в себя отображение типа «geo_point»

перед добавлением различного _types

расположения My сортировать запрос будет выглядеть следующим образом:

"sort" : [ 
    { 

      "_geo_distance" : { 
      "postcode.location" : [' . $mylocation_long . ',' . $mylocation_lat . '], 
      "order" : "asc", 
      "unit" : "km" 
     } 
    } 
], 

с добавлением _types к данным и не картирование это уже не работает, а я указываю это нравится:

"sort" : [ 
    { 

      "_geo_distance" : { 
      "$country.location" : [' . $mylocation_long . ',' . $mylocation_lat . '], 
      "order" : "asc", 
      "unit" : "km" 
     } 
    } 
], 

это работает нормально.

Однако есть моменты, когда запросы необходимо выполнять за пределами отдельной страны. Поэтому установка «us.location» неверна и не работает.

В этом случае, как мне выполнить эту сортировку, когда я не знаю страну, и мне нужно отсортировать ее по карте.

Или это не может быть сделано, и все документы должны иметь один и тот же _type, чтобы это работало?

+0

Вы пробовали использовать подстановочные:. * "Местоположение"? Еще не пробовал это, и не уверен, насколько это было бы. –

+0

В [multi-index docs] (http://www.elasticsearch.org/guide/reference/api/multi-index/) также говорится о добавлении списка индексов, разделенных запятыми, но без примера. –

ответ

2

Извините, если мне не хватает чего-то очевидного, но почему вы не можете просто сортировать по «местоположению». Это, кажется, работает просто отлично:

curl -XDELETE localhost:9200/test-idx/ && echo 
curl -XPUT localhost:9200/test-idx/ -d ' 
{ 
    "settings":{ 
     "number_of_shards":1, 
     "number_of_replicas":0 
    }, 
    "mappings": { 
     "us": { 
      "properties": { 
       "location": { 
        "type": "geo_point" 
       }   
      } 
     }, 
     "uk": { 
      "properties": { 
       "location": { 
        "type": "geo_point" 
       }   
      } 
     }, 
     "au": { 
      "properties": { 
       "location": { 
        "type": "geo_point" 
       }   
      } 
     } 
    } 
}' && echo 
curl -XPUT localhost:9200/test-idx/us/1 -d ' 
{ 
    "location": "42.3606402,-71.0674569" 
} 
' && echo 
curl -XPUT localhost:9200/test-idx/uk/2 -d ' 
{ 
    "location": "51.5286416,-0.1017943" 
} 
' && echo 
curl -XPUT localhost:9200/test-idx/au/3 -d ' 
{ 
    "location": "-33.8471226,151.0594183" 
} 
' && echo 

curl -XPOST localhost:9200/test-idx/_refresh && echo 
curl "localhost:9200/test-idx/_search?pretty" -d '{ 
    "query": { 
     "match_all": {} 
    }, 
    "sort" : [ 
     { 
       "_geo_distance" : { 
       "location" : "52.3712989,4.8937347", 
       "order" : "asc", 
       "unit" : "km" 
      } 
     } 
    ] 
}' && echo 

выход:

{"ok":true,"acknowledged":true} 
{"ok":true,"acknowledged":true} 
{"ok":true,"_index":"test-idx","_type":"us","_id":"1","_version":1} 
{"ok":true,"_index":"test-idx","_type":"uk","_id":"2","_version":1} 
{"ok":true,"_index":"test-idx","_type":"au","_id":"3","_version":1} 
{"ok":true,"_shards":{"total":1,"successful":1,"failed":0}} 
{ 
    "took" : 3, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 3, 
    "max_score" : null, 
    "hits" : [ { 
     "_index" : "test-idx", 
     "_type" : "uk", 
     "_id" : "2", 
     "_score" : null, "_source" : {"location": "51.5286416,-0.1017943"}, 
     "sort" : [ 355.2735714686373 ] 
    }, { 
     "_index" : "test-idx", 
     "_type" : "us", 
     "_id" : "1", 
     "_score" : null, "_source" : {"location": "42.3606402,-71.0674569"}, 
     "sort" : [ 5563.606078215864 ] 
    }, { 
     "_index" : "test-idx", 
     "_type" : "au", 
     "_id" : "3", 
     "_score" : null, "_source" : {"location": "-33.8471226,151.0594183"}, 
     "sort" : [ 16650.926847312003 ] 
    } ] 
    } 
} 
0

Что происходит, когда вы указываете рабочий запрос в/index/_search вместо/index/type/_search?

+0

В основном поиске, как у вас есть, это хорошо, он работает в любом случае, это больше о том, как я ссылаюсь на pin.location в сортировщике geo_distance. Когда настроено отображение индекса, оно было настроено с «местом», установленным на «geo_point». но это означает, что я должен ссылаться на него по _type. us.location. тогда как мне не нужно быть конкретным по типу. поэтому его вопрос о том, как ссылаться на pin.location, когда сопоставление задано для определенного типа, если это имеет смысл. –

Смежные вопросы