Во-первых - вам нужно определить поле местоположения. Режим без схемы предназначен для быстрого создания прототипов. Если вам нужны более конкретные поля (и убедитесь, что поля получают правильный тип в рабочей среде), вам придется настроить их явно. Для этого используйте тип LatLonPointSpatialField и сделайте его однозначным.
Сначала определите тип поля для использования (это , принятое из документации API схемы ):
curl -X POST -H 'Content-type:application/json' --data-binary '{ "add-field-type" : {
"name":"location_type",
"class":"LatLonPointSpecialField"
} 'http://localhost:8983/solr/gettingstarted/schema
Затем добавьте поле с таким типом:
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field":{
"name":"location",
"type":"location_type",
"stored":true }
}' http://localhost:8983/solr/gettingstarted/schema
Две другие проблемы могут быть исправлены с помощью пользовательской цепочки обновлений (вы указываете имя цепочки в качестве параметра URL update.chain
при индексации документа).
Чтобы автоматически назначить guid для любого проиндексированного документа, вы можете использовать UUIDUpdateProcessorFactory . Укажите имя поля (id
) в качестве параметра fieldName
.
Чтобы получить широту и долготу, объединенные в одно поле с ,
в качестве разделителя, вы можете использовать ConcatFieldUpdateProcessorFactory . Здесь важно то, что он объединяет список значений, заданных для одного значащего поля, в одно значение - он не объединяет два разных имени поля. Чтобы исправить это, мы можем использовать CloneFieldUpdateProcessor для перемещения значения широты и долготы в отдельное поле.
<updateRequestProcessorChain name="populate-location">
<processor class="solr.CloneFieldUpdateProcessorFactory">
<arr name="source">
<str>latitude</str>
<str>longitude</str>
</arr>
<str name="dest">location</str>
</processor>
<processor class="solr.ConcatFieldUpdateProcessorFactory">
<str name="delimiter">,</str>
</processor>
</updateRequestProcessorChain
Если вы добавите поле местоположения позже и у вас уже есть данные в вашей базе данных, это не будет работать. Solr не будет касаться данных, которые уже были проиндексированы, и вам придется переиндексировать, чтобы ваша информация была обработана и проиндексирована правильным образом. Это верно независимо от того, как вы получаете контент в поле location
.
Старый пример, вероятно, был наоборот - раньше вы отправляли латлонную пару, и она индексировалась как два отдельных значения - одно для широты и одно для долготы - под капотом. Вероятно, вы могли бы обойти это, отправив по одному значению для каждого, но на самом деле оно предназначалось для работы наоборот - отправка одного значения и индексация его как двух отдельных полей. Поскольку геопространственная поддержка в Lucene (и Solr) только начиналась, уже существующие типы использовались повторно вместо создания более выделенных типов.