Моя первоначальная цель состояла в том, чтобы сопоставить несколько столбцов из таблицы с одним полем в 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 работает только с именованными столбцами в тегах полей в сущности.
Я надеюсь, что кто-то может найти ошибку или предложить мне лучший способ.
Редактировать: не хватало некоторых кавычек, это произошло только в случае изменения имен и запросов для примеров. Также я попытался исправить некоторые размытые формулировки абзацев.
copyField source="*" dest="searchAll" />
схема не может быть возможным решением? Вы также можете настроить это, чтобы просто сопоставить любое поле, оканчивающееся с _t, с текстовым полем и т. д. - person MatsLindh   schedule 04.02.2016stored="false"
иindexed="false"
, если это разрешено, что будет означать, что оно не индексирует и не сохраняет содержимое, а затем использует директивуcopyField
для перемещения все в общее поле? - person MatsLindh   schedule 04.02.2016