0

mysql dbがあり、シャーディングルールに従って名前が付けられたデータテーブルがあります。これは、名前に同じプレフィックス(例: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>

4

2 に答える 2

1

私はあなたが望むことをするためのストアドプロシージャを作成し、それを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>
于 2012-07-24T16:56:35.263 に答える
0

まず、ネストされたエントリクエリで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;
于 2012-07-27T08:08:23.090 に答える