3

次のような 2 つの XML ドキュメント タイプ A と B があるとします。

A:

<xml>
    <a>
        <name>First Number</name>
        <num>1</num>
    </a>
    <a>
        <name>Second Number</name>
        <num>2</num>
    </a>
</xml>

B:

<xml>
    <b>
        <aKey>1</aKey>
        <value>one</value>
    </b>
    <b>
        <aKey>2</aKey>
        <value>two</value>
    </b>
</xml>

次のようにインデックスを付けたいと思います。

<doc>
    <str name="name">First Name</str>
    <int name="num">1</int>
    <str name="spoken">one</str>
</doc>
<doc>
    <str name="name">Second Name</str>
    <int name="num">2</int>
    <str name="spoken">two</str>
</doc>

したがって、実際には、A の値を B のキーとして使用しようとしています。DataImportHandler を使用して、データ構成定義として以下を使用しました。

<dataConfig>
    <dataSource type="FileDataSource" encoding="UTF-8" />
    <document>
        <entity name="document" transformer="LogTransformer" logLevel="trace"
            processor="FileListEntityProcessor" baseDir="/tmp/somedir"
            fileName="A.*.xml$" recursive="false" rootEntity="false"
            dataSource="null">
            <entity name="a"
                transformer="RegexTransformer,TemplateTransformer,LogTransformer"
                logLevel="trace" processor="XPathEntityProcessor" url="${document.fileAbsolutePath}"
                stream="true" rootEntity="true" forEach="/xml/a">
                <field column="name" xpath="/xml/a/name" />
                <field column="num" xpath="/xml/a/num" />


                <entity name="b" transformer="LogTransformer"
                    processor="XPathEntityProcessor" url="/tmp/somedir/b.xml"
                    stream="false" forEach="/xml/b" logLevel="trace">
                    <field column="spoken" xpath="/xml/b/value[../aKey=${a.num}]" />
                </entity>

            </entity>
        </entity>
    </document>
</dataConfig>

ただし、次の 2 つの問題が発生します。

  1. どの行にも一致する述語を含む XPath 式を取得できません。のような代替手段を使用するか/xml/b[aKey=${a.num}]/value、ハードコードされた値を使用するかに関係なくaKey
  2. 述語を削除しても、パーサーは A の行ごとに 1 回 B ファイルを調べますが、これは明らかに非効率的です。

私の質問は、上記の問題に照らして、 DataImportHandler を使用してデータを正しく効率的にインデックス化するにはどうすればよいですか?

Solr 3.6.2 を使用しています。

注: これはこの質問に少し似ていますが、RDBMS と XML ドキュメントではなく、2 つの XML ドキュメント タイプを扱っています。

4

2 に答える 2

2

その種のデータに DataImportHandler を使用した経験は非常に悪いです。データをマージする単純な python スクリプトは、現在の構成よりもおそらく小さくなり、はるかに読みやすくなります。要件とデータ サイズに応じて、一時的な xml ファイルを作成するか、結果を直接 SOLR にパイプすることができます。本当に DataImportHandler を使用する必要がある場合は、URLDataSource を使用して、xml を生成する最小限のサーバーをセットアップできます。明らかに、私は Python のファンですが、Ruby、Perl などでも簡単な仕事である可能性が非常に高いです。

于 2013-05-20T21:03:30.050 に答える
0

当初言及し​​ていなかった追加の設計要件のため、最終的に別のソリューションを採用しました。以下、解説と考察です。そう....

Solr インスタンスのインポート フロー タイプが 1 つまたは 2 つしかない場合:

次に、 Achim の回答に従って、独自のインポーターを開発するのが最善かもしれません。Achimが提案するように、お気に入りのスクリプト言語で、または Java でSolrJ の ConcurrentUpdateSolrServer.

これは、より複雑なインポート フローを定義する必要があると、DataImportHandler フレームワークの学習曲線が急上昇するためです。

重要な数の異なるインポート フローがある場合:

いずれにせよ、おそらく似たようなものを実装することになるので、DataImportHandler にとどまることを検討することをお勧めします。また、フレームワークは完全にモジュール化され、拡張可能であるため、カスタマイズは問題になりません。

これは私が言及した追加の要件であるため、最終的にはそのルートで行きました。

私が特定の問題をどのように解決したかは、参照する必要のあるファイルを個別のコアにインデックス付けし、変更SolrEntityProcessorを使用してそのデータにアクセスすることでした。変更は次のとおりです。

  • サブエンティティの問題にパッチを適用し、
  • キャッシングの追加 (Guava を使用した迅速な解決策。ローカルで他のコアにアクセスするために利用可能な Solr API を使用するより良い方法があるかもしれませんが、その時点では少し急いでいました)。

ファイルごとに新しいコアを作成したくない場合、別の方法は Achim のアイデアの拡張です。つまりEntityProcessor、データをプリロードして何らかの方法でクエリを実行できるようにするカスタムを作成します。

于 2013-06-05T19:40:34.507 に答える