Как удалить дубликаты из многозначных полей в SOLR?

Я пробовал решения, перечисленные в следующем вопросе.

Удаление повторяющихся значений Solr в многозначном поле

Я использую обработчик импорта данных и создаю несколько значений для поля с помощью RegexTransformer.

Мой sql возвращает это для столбца FOO

Джонни Кэш, Бонни Мани, Хани Банни, Джонни Кэш

и я сохраняю его в многозначном поле foo, используя splitBy=","

<field column="FOO" name="foo" splitBy=","/>    

и он хранится в многозначном поле как таковой

{"Джонни Кэш", "Бонни Мани", "Милый зайчик", "Джонни Кэш"}

Я добавил это в solrconfig xml

  <updateRequestProcessorChain name="distinctMultiValued" default="true">
    <!-- To remove duplicate values in a multivalued field-->
    <processor class="DistributedUpdateProcessorFactory"/>
    <processor class="UniqFieldsUpdateProcessorFactory">
        <str name="fieldRegex">foo</str>
    </processor>
    <processor class="solr.LogUpdateProcessorFactory" />        
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>

Я также пробовал fieldName вместо fieldRegex и пробовал * oo вместо foo, но дубликаты остаются.

Это как-то связано с RegexTransformer?

У меня также есть цепочка обновлений с TrimFieldsUpdateProcessorFactory, чем работает без проблем.


person Razen    schedule 03.05.2016    source источник


Ответы (3)


может быть, вам нужно указать полное имя класса в классе процесса и <lst name="fields"> <str>multivaluedfield</str></lst>. например

<processor class="org.apache.solr.update.processor.UniqFieldsUpdateProcessorFactory"> <lst name="fields"> <str>multivaluedFieldXYZ</str> </lst> </processor>

person Vinod    schedule 03.05.2016
comment
Это не сработает. Опция fields устарела, начиная с SOLR 5. - person Razen; 03.05.2016
comment
В файле схемы добавьте этот фильтр в определение типа многозначного поля <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> - person Vinod; 03.05.2016
comment
Разве это не просто удаляет дубликаты токенов. Он не удаляет повторяющиеся значения из поля в результатах запроса, не так ли? - person Razen; 03.05.2016

Я смог решить эту проблему, переместив UniqFieldsUpdateProcessorFactory в существующий блок <updateRequestProcessorChain>, который у меня был.

  <updateRequestProcessorChain name="skip-empty" default="true">
    <!--  Next two processors affect all fields - default configuration -->
    <processor class="TrimFieldUpdateProcessorFactory" />
    <processor class="RemoveBlankFieldUpdateProcessorFactory" />
    <processor class="UniqFieldsUpdateProcessorFactory">
        <str name="fieldRegex">.*oo</str>
    </processor>
    <processor class="solr.LogUpdateProcessorFactory" />
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>

Документация SOLR UpdateRequestProcessorChain

Максимум одна цепочка процессоров может быть настроена как «по умолчанию». если процессор по умолчанию не настроен, для вас создается неявное значение по умолчанию с использованием LogUpdateProcessorFactory и RunUpdateProcessorFactory. Предоставление цепочки процессоров по умолчанию может быть единственным способом повлиять на документы, проиндексированные из некоторых источников, таких как обработчик импорта данных.

person Razen    schedule 03.05.2016

Я использую solrJ для привязки документов, и, чтобы избежать дублирования значений, я определил свое многозначное поле как HashSet.

@Field("description") public Collection description = new HashSet‹>();

person lgonzales    schedule 28.06.2018