SOLR: как скопировать данные в другое поле с отфильтрованными значениями? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть поле Price в solr с указанными ниже типами значений.

"Price":"0.07 AUD"
"Price":"10.00"
"Price":"AUD"

Итак, мне нужно другое настраиваемое поле CustomPrice

Для создания этого я использовал поле копирования в скопировать данные из Price в CustomPrice

Но мне нужны только числовые значения в CustomPrice, как показано ниже

"CustomPrice":"0.07"
"CustomPrice":"10.00"
"CustomPrice":"0"

Также необходимо CustomPrice тип поля как pfloat, поэтому мы можем отсортировать поле по номеру.

Я пытался CopyField, PatternTokenizerFactory, PatternReplaceFilterFactory сделать это.

Моя старая ссылка на вопрос: SOLR: Как отсортировать по цене, когда цена не добавлена ​​должным образом?

Итак, как мне создать новое поле с плавающей точкой, в которое я могу копировать только числовые значения из поля Цена?

Ниже это ошибка, когда я устанавливаю новый тип поля как float

"error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","java.lang.NumberFormatException"],
    "msg":"ERROR: [doc=12958142955618] Error adding field 'Price'='129.95 AUD' msg=For input string: \"129.95 AUD\"",
    "code":400}}

1 Ответ

1 голос
/ 24 февраля 2020

Этого можно достичь с помощью 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


Вот внесенные изменения.

Изменение в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...