Этого можно достичь с помощью Update Request Processors
. Каждый запрос на обновление, полученный Solr
, запускается через цепочку плагинов, известных как Update Request Processors
.
. Это может быть полезно, например, для добавления поля в индексируемый документ; изменить значение определенного поля; или удалить обновление, если входящий документ не соответствует определенным критериям.
Вы можете добавить процессор для достижения того же.
Процессор:
<processor class="solr.RegexReplaceProcessorFactory">
<str name="fieldName">price</str>
<str name="pattern">[^0-9.]+</str>
<str name="replacement"></str>
<bool name="literalReplacement">true</bool>
</processor>
Процессор можно добавить к updateRequestProcessorChain
, как показано ниже
<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"
processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields">
<processor class="solr.RegexReplaceProcessorFactory">
<str name="fieldName">price</str>
<str name="pattern">[^0-9.]+</str>
<str name="replacement"></str>
<bool name="literalReplacement">true</bool>
</processor>
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.DistributedUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
Добавить эту запись в файл управляемой схемы.
<field name="copyFloatPrice" type="float" indexed="true" stored="true" multiValued="false" docValues="true"/>
<copyField source="price" dest="copyFloatPrice"/>
Когда я запрашиваю solr, я получаю следующие данные. Я мог бы выполнить сортировку по copyFloatPrice
.
![SOlr Query Page](https://i.stack.imgur.com/dOtRj.png)
Вот внесенные изменения.
Изменение в solrConfig.xml
.
<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"
processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields">
<processor class="solr.CloneFieldUpdateProcessorFactory">
<str name="source">price</str>
<str name="dest">copyFloatPrice</str>
</processor>
<processor class="solr.RegexReplaceProcessorFactory">
<str name="fieldName">copyFloatPrice</str>
<str name="pattern">[^0-9.]+</str>
<str name="replacement"></str>
<bool name="literalReplacement">true</bool>
</processor>
<processor class="solr.RegexReplaceProcessorFactory">
<str name="fieldName">copyFloatPrice</str>
<str name="pattern">^$</str>
<str name="replacement">0</str>
<bool name="literalReplacement">true</bool>
</processor>
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.DistributedUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
В файле managed-schema
внесены следующие изменения:
<field name="price" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="copyFloatPrice" type="float" indexed="true" stored="true" multiValued="false" docValues="true"/>
Ответ на запрос solr, в котором показаны данные, индексированные для price
, copyFloatPrice
и сортировка достигнута.
![Solr Response final](https://i.stack.imgur.com/cUdft.png)