如何从 Solr 的数据导入器中迭代查询大型 MySQL 数据集?



我的生产数据库中有 256 个表。每个表大约有 10,000,000 行 - 我无法在一个SELECT查询中获取任何一个表的所有行。

实际上,我将查询阶段放在 solr/conf/data-config 中.xml就像这样作为测试;它有一个表,我正在选择所有行。

我使用Solr(基于Java(。我触发数据的索引,如下所示:

curl --max-time 36000 -i localhost:portNum/solr/dataimport?command=full-import

这是 XML 中的内容:

<entity name="file" query="SELECT *, LOWER(REPLACE(sw_name, ' ', '')) packed_sw_name, CAST(group_id as char) group_id_s FROM tblTmp1"/>

但是现在,我想获取用于数据导入的表 number(tblNum( 的参数,并迭代选择 id 范围之间的行 - 使用美元符号变量替换,查询将如下所示:

<entity name="file" query="SELECT *, LOWER(REPLACE(sw_name, ' ', '')) packed_sw_name, CAST(group_id as char) group_id_s FROM tblTmp1_$tblNum where id >=$startSn and id<$endSn " />

如何迭代查询数据库,应在哪个文件中设置?

如果您想添加这种逻辑,我不知道这是否是编写 SQL 查询的最佳位置。

如果您确实按照配置使用导入器,则需要使用光标在循环中进行选择——将结果放入 Solr 的临时表中。我不知道它是如何用 MySQL 语法工作的,但我记得它与其他 SQL 方言相似(但不完全相同(——这是 PostgreSQL 的 PL/PgSQL 语言中的游标查询示例:

CREATE FUNCTION urge_to_merge( ) RETURNS INTEGER AS '
    DECLARE 
        pacman              CURSOR FOR SELECT * FROM forsale_fsuserprofileimage;
        pellet              forsale_fsuserprofileimage%ROWTYPE;

    BEGIN 
        OPEN pacman;
        LOOP
            FETCH pacman INTO pellet;
            EXIT WHEN NOT FOUND;
            UPDATE forsale_fsuserprofile 
            SET 
                image = pellet.image,
                w = pellet.w,
                h = pellet.h
            WHERE 
                id = pellet.userprofile_id;
        END LOOP;
        RETURN( 1 );
    END;

' LANGUAGE 'plpgsql';

我建议放弃Solr库存数据导入器并编写一个简单的CLI程序 - 这样,您可以控制何时执行查询。你可以用 Java 编写它,但你不必这样做;使用Solr的HTTP API,您可以使用任何其他语言,只要它可以发出HTTP请求和MySQL API调用:Python,Ruby,带有curl的bash脚本,甚至是PHP-CLI,如果这是你的事情。

许多语言已经绑定了Solr的HTTP API,你可以开箱即用(在这方面我可以保证Python和Ruby(,但这里有一篇文章,其中包含自己使用API是多么容易的示例: https://lucene.apache.org/solr/guide/7_7/searching.html#searching

相关内容

  • 没有找到相关文章