Solr: заставить DataImportHandler игнорировать отсутствующие элементы

Я пытаюсь использовать DIH для импорта данных из XML-источника, которым я не пользуюсь. Этот XML содержит необязательные элементы, сгруппированные как атрибуты, например цвет или вкус. Не все объекты имеют все атрибуты, что совершенно нормально и допустимо. К сожалению, DIH пропускает эти объекты, когда они мне нужны. Это мои данные-config.xml

<dataConfig>
  <dataSource type="FileDataSource" name="datasource"/>
  <document>
   <entity
     name="files"
     processor="FileListEntityProcessor"
     baseDir="C:\\"
     fileName="recipe_page.*xml"
     recursive="false"
     rootEntity="false"
     dataSource="null">
     <entity
      name="file"
      processor="XPathEntityProcessor"
      url="${files.fileAbsolutePath}"
      forEach="/results|/results/recipe"
      stream="true"
      transformer="TemplateTransformer">
       <field column="recipe_id" xpath="/results/recipe/recipeID" />
       <field column="recipe_title" xpath="/results/recipe/recipeTitle" />     
       <field column="color" xpath="/results/recipe/attributes/Color" default="" />
       <field column="drink_classification" xpath="/results/recipe/attributes/DrinkClassification" default="" />
       <field column="flavor" xpath="/results/recipe/attributes/Flavor" default="" />        
       <field column="uid" template="recipe_${file.recipe_id}" />
       <field column="document_type" template="recipe" />
    </entity>
   </entity>
  </document>
</dataConfig>

Как я могу сказать DIH игнорировать отсутствующие элементы или хотя бы установить для них значения по умолчанию?


person Jene    schedule 14.11.2017    source источник


Ответы (1)


Я не уверен, что знаю, как сообщить XPathEntityProcessor игнорировать отсутствующие операторы xpath, но у меня есть идея, что вы можете установить значения по умолчанию для полей, используя Transformer и, в частности, TemplateTransformer

Вы можете использовать преобразователь шаблона для создания или изменения значения поля, возможно, используя значение других полей. В шаблон можно вставить дополнительный текст.

Я ожидаю, что что-то вроде этого должно сработать для вас:

<entity name="en" pk="id" transformer="TemplateTransformer" ...>

  <!-- generate a full address from fields containing the component parts -->
  <field column="color" template="default-color" />
</entity>

Здесь я пытаюсь заменить значение поля на значение, однако я не уверен, что это поможет (ожидаю, что оно заменит значение, однако, если оно существует, оно должно быть перепроверено)

В этом случае можно будет создать собственный Трансформер:

public class DefaultValueTransformer {
        public Object transformRow(Map<String, Object> row) {
                String color= row.get("color");
                if (artist != null)             
                        row.put("color", "default-color-value");

                return row;
        }
}

и позже использовать как это:

<entity name="entity" query="..." transformer="my.package.DefaultValueTransformer">
person Mysterion    schedule 15.11.2017
comment
Я искал подход all-xml. Если бы я использовал Java, я мог бы просто обойти весь подход DIH. Я полагаю, что это невозможно :( - person Jene; 16.11.2017
comment
попробуйте с TemplateTransformer, хотя я не уверен, что это поможет - person Mysterion; 16.11.2017