Во-первых, вам нужно будет определить поле местоположения. Режим без схемы создан для быстрого прототипирования, если вам нужны более конкретные поля (и вы уверены, что поля получают правильный тип в рабочей среде), вам придется настроить их явно. Используйте тип LatLonPointSpatialField для этого , и сделайте его однозначным.
Сначала определите тип поля для использования (это взяты из документации Schema 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
Две другие проблемы можно устранить с помощью пользовательской цепочки обновлений (имя цепочки вы указываете в качестве параметра update.chain
URL при индексировании документа).
Чтобы автоматически назначить 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
.
В старом примере, вероятно, все наоборот: раньше вы отправляли пару latlon, и она индексировалась как два отдельных значения — одно для широты и одно для долготы — под капотом. Вероятно, вы могли бы обойти это, отправив одно значение для каждого, но на самом деле это должно было работать наоборот — отправлять одно значение и индексировать его как два отдельных поля. Поскольку геопространственная поддержка в Lucene (и Solr) только начиналась, уже существующие типы использовались повторно вместо создания более специализированных типов.
person
MatsLindh
schedule
29.10.2018