Solr DataimportHandler: есть ли возможность сразу сопоставить все столбцы результатов запроса с одним полем solr, не зная имен столбцов?

Моя первоначальная цель состояла в том, чтобы сопоставить несколько столбцов из таблицы с одним полем в solr, не зная точных имен столбцов. Это может дать возможность сопоставить все столбцы результатов запроса, полученные из запроса объекта, с одним полем, например, со всеми столбцами с типом text (или varchar).

Я использую DataimportHandler для импорта данных с сервера sql. В конфигурации источника данных нет проблем, так как прямое сопоставление с использованием имени столбца и имени зависимого поля работает нормально. Например, используя

    <entity name="foo" dataSource="my_database" query="select * from foo">
      <field column="db_column_name" name="solr_field_name"/>
    </entity>

После многих часов попыток и поиска я определил дополнительную таблицу MappingTable, содержащую все имена столбцов и поля для сопоставления, как описано в Solr - DataImportHandler: при попытке использовать значения столбцов в качестве имен полей многозначные поля сохраняют только первый результат

MappingTable выглядит так

SOLR_FIELD    MY_FIELD
name          column_name
id            column_id
content       column_desc
content       column_second_desc

Исходная таблица выглядит так

column_id   column_name   column_desc
123         goose         this column doesnt quak
342         plain         this is another description

Между этими таблицами не определен внешний ключ. Итак, еще раз, что я подумал сделать здесь, это использовать MappingTable, чтобы получить данные из каждой строки из SourceTable и поместить их в поля solr без явного именования имен столбцов Sourcetable в коде (возможность создать дополнительную таблицу по-прежнему будет поддерживать процесс достаточно динамично.

Этот пример показывает, как я пытался реализовать сопоставление

<entity name="source" dataSource="my_database" query="SELECT * FROM SourceTable">
  <entity name="mapping" query="select * from MappingTable" transformer="ClobTransformer" >
    <field name="${mapping.SOLR_FIELD}" column="MY_FIELD" clob="true" />
  </entity>
</entity>

Как вы можете видеть, это возвращает мне только четыре документа, которые содержат слова column_name, column_id, column_desc, column_second_desc так часто, как solr находит строки (наборы данных) в моей SourceTable.

После этого я попытался перевернуть термины и использовать column="${mapping.MY_FIELD}" для динамического получения имени столбца из MappingTable.

<entity name="mapping" query="select * from MappingTable" transformer="ClobTransformer" >
  <entity name="source" dataSource="my_database" query="SELECT * FROM SourceTable>
    <field name="${mapping.SOLR_FIELD}" column="${mapping.MY_FIELD}"/>
  </entity>
</entity>

Но это не работает для меня. Solr не выполняет команду /dataimport?command=full-index и не дает мне подсказки в разделе «Ведение журнала» в администраторе solr.

Возможно, есть возможность реализовать это с помощью внешнего ключа в таблице. Я также подумал о подходе к нему с помощью ScriptTransformer и посмотрел ответ в Динамические имена столбцов с использованием DIH (DataImportHandler), но здесь показан только способ реализации динамического пользовательского поля solr, и это также предполагает, что пользователь знает имена исходных столбцов. Поэтому я пытаюсь примерно так, как описано в In solr dih import two double в одном месте

<script><![CDATA[
    function catchColumns(row)        {
        var descriptions = new java.util.ArrayList();
        for (var i=0; i<row.length; i++) {
            var value = row[i];
            if (value.equals(String))
            {
                descriptions.add(row[i]);
            }
        }
        row.put("description",descriptions);
        return row;
    }       ]]></script>

Использование простого определения объекта

   <entity name="foo" 
           dataSource="my_database"
           transformer="script:catchColumns" 
           query="select * from foo">
      ...
    </entity>

Но я предполагаю, что ScriptTransformer работает только с именованными столбцами в тегах полей в сущности.

Я надеюсь, что кто-то может найти ошибку или предложить мне лучший способ.


Редактировать: не хватало некоторых кавычек, это произошло только в случае изменения имен и запросов для примеров. Также я попытался исправить некоторые размытые формулировки абзацев.


person Charlowing    schedule 04.02.2016    source источник
comment
Разве copyField source="*" dest="searchAll" /> схема не может быть возможным решением? Вы также можете настроить это, чтобы просто сопоставить любое поле, оканчивающееся с _t, с текстовым полем и т. д.   -  person MatsLindh    schedule 04.02.2016
comment
Что ж, это сработало бы, если бы я уже заполнил поля в solr, но моя проблема начинается раньше в процессе: я хочу получить все данные из таблицы в базе данных, не называя каждый столбец. Что-то вроде ‹field column=* name=all/›   -  person Charlowing    schedule 04.02.2016
comment
Возможно, вы сможете решить эту проблему, имея определение поля с именем карточки поля (*), установив для него значения stored="false" и indexed="false", если это разрешено, что будет означать, что оно не индексирует и не сохраняет содержимое, а затем использует директиву copyField для перемещения все в общее поле?   -  person MatsLindh    schedule 04.02.2016