Может ли Solr обрабатывать импорт данных из таких таблиц, как table1, table2, tableN?

У меня есть база данных mysql и таблицы данных, названные в соответствии с правилом сегментирования, что означает, что имя имеет один и тот же префикс, например: the_table_, и имеет номер для суффикса, поэтому имя таблицы будет the_table_1, the_table_2, the_table_3. Когда мы хотим выбрать строку, нам нужно найти суффикс таблицы из sql select mod(primary_key_id, 64)+1, правило сегментирования, а 64 — это базовый номер, что означает, что у нас есть 64 таблицы.

Теперь мы хотим использовать Solr для индексации данных в таблицах, но solr data-config.xml не может поддерживать sql-запрос с динамическим именем. Есть ли какие-либо предложения по устранению этой проблемы?

Такие вещи?

<entity name="audit" 
        query="select id,monitor_type,city,STATUS,is_history,timeout,author,author_uid,author_ip,operator_uid,operator,created_at,description from `main_table`">
        <field column="ID" name="id" />
        <field column="MONITOR_TYPE" name="monitor_type" />
        <field column="CITY" name="city" />
        <field column="STATUS" name="status" />
        <field column="IS_HISTORY" name="is_history" />
        <field column="AUTHOR" name="author" />
        <field column="AUTHOR_UID" name="author_uid" />
        <field column="AUTHOR_IP" name="author_ip" />
        <field column="OPERATOR_UID" name="operator_uid" />
        <field column="OPERATOR" name="operator" />

        <entity name="distribution" query="select mod(${audit.ID}, 256)+1 as table_id">
          <entity name="details" query="select content from detail${distribution.table_id} where id=${audit.ID}">
            <field column="CONTENT" name="content" />
          </entity>
        </entity>
</entity>


person Eric_Chen    schedule 24.07.2012    source источник
comment
Рассматривали ли вы возможность использования представления MySQL для подготовки данных для Solr?   -  person Marko Bonaci    schedule 24.07.2012
comment
Вы пробовали использовать заполнители? Что-то вроде ${dataimporter.tablename}, и вы передаете параметр имени таблицы при вызове URL-адреса импорта данных.   -  person javanna    schedule 24.07.2012


Ответы (2)


Я бы создал хранимую процедуру, чтобы делать то, что вы хотите, а затем вызывал ее из Solr. Что-то вроде этого

CREATE PROCEDURE `GetAuditDetails`(IN auditID INT)
BEGIN
  DECLARE tableID INT DEFAULT 0;
  DECLARE sqlString VARCHAR(100) DEFAULT '';
  SELECT MOD(auditID, 256)+1 INTO tableID;
  SET @sqlString = CONCAT('select content from detail', tableID, ' where id=', auditID );
  PREPARE stmt FROM @sqlString;
  EXECUTE stmt;
END;

<entity name="audit" 
    query="select id,monitor_type,city,STATUS,is_history,timeout,author,author_uid,author_ip,operator_uid,operator,created_at,description from `main_table`">
        <field column="ID" name="id" />
        <field column="MONITOR_TYPE" name="monitor_type" />
        <field column="CITY" name="city" />
        <field column="STATUS" name="status" />
        <field column="IS_HISTORY" name="is_history" />
        <field column="AUTHOR" name="author" />
        <field column="AUTHOR_UID" name="author_uid" />
        <field column="AUTHOR_IP" name="author_ip" />
        <field column="OPERATOR_UID" name="operator_uid" />
        <field column="OPERATOR" name="operator" />

        <entity name="details" query="CALL GetAuditDetails(${audit.ID})">
           <field column="CONTENT" name="content" />
        </entity>
</entity>
person Evan    schedule 24.07.2012
comment
Хотя с процедурой mysql что-то не так, но она действительно решает мою проблему... спасибо, Эван... - person Eric_Chen; 27.07.2012

Во-первых, в запросе вложенной записи следует использовать не audit.ID, а ${audit.id}, иначе будет исключение. Во-вторых, для процедуры Mysql:

CREATE PROCEDURE `GetAuditDetails`(IN auditID INT)
BEGIN
  DECLARE tableID INT DEFAULT 0;
  DECLARE sqlString VARCHAR(100) DEFAULT '';
  SELECT MOD(auditID, 256)+1 INTO tableID;
  SET @sqlString = CONCAT('select content from detail', tableID, ' where id=', auditID );
  PREPARE stmt FROM @sqlString;
  EXECUTE stmt;
END;
person Eric_Chen    schedule 27.07.2012