4

この問題に関連する解決策をいくつか見つけました。説明するように、関連するソリューションは私には機能しません。(私はSolr 4.0を使用しており、Oracle 11gデータベースに格納されているデータにインデックスを付けています。)

Jonck van der Kogelの関連ソリューション(2009年から)については、ここで説明します。彼は、Solrに同梱されているClobTransformerのようなカスタムTransformerの作成について説明しています。これはエレガントな道を進んでいますが、現在Solrと統合されているTikaを使用していません。(彼は外部のPDFBoxとFontBoxを使用しています。)これにより、複数のメンテナンス/アップグレードの依存関係が作成されます。また、PDFに加えてWord文書のインデックスを作成できる必要があります。

Kogelのソリューションは正しい方向に進んでいるようですが、Solrに含まれているTikaクラスをカスタムTransformerで使用する方法はありますか?これにより、KogelのエレガントなデータベースソリューションですべてのTika機能が可能になります。

別の関連するソリューションは、Solrに同梱されているExtractingRequestHandler (ERH)です。ただし、名前が示すように、これはリッチテキストドキュメントのHTTP投稿を処理するなどのリクエストハンドラです。この方法でデータベースからドキュメントを抽出するには、パフォーマンスとセキュリティの問題があります。データベースのBLOBにHTTP経由でアクセスできるようにする必要があります。データベースBLOBからの直接取り込みにERHを使用することについての議論は見つかりませんでした。Solr Cellを使用してデータベースBLOBから直接取り込むことは可能ですか?

別の関連する解決策は、byte []を文字列に変換するためのTransformer(上記のKogelのような)を作成することです(DataImportHandler FAQから)。真のバイナリドキュメントでは、これはジャンクをインデックスにフィードし、Tikaのようにテキスト要素を適切に抽出しません。動作しません。

最後の関連ソリューションは、RichDocumentHandlerによって提供されるUpdateRichDocumentsです。これは非推奨であり、Solrでは使用できなくなりました。このページでは、ExtractingRequestHandler(上記で説明)を参照しています。

正しい解決策は、DataImportHandlerとTikaクラスを使用するカスタマーTransformerを使用することのようです。これはどのように作動しますか?

4

2 に答える 2

6

数時間後...まず、この問題に関する誤解を招く、間違った、役に立たない情報がたくさんあります。すべてを1か所で提供しているページはないようです。すべての情報は意図的なものですが、バージョンが異なっていても、頭を悩ませているものもありますが、問題は解決しませんでした。これが私が学んだことと解決策の私のコレクションです。繰り返しになりますが、私はSolr 4.0(Tomcat上)+Oracle11gを使用しています。

ソリューションの概要:DataImportHandler + TikaEntityProcessor + FieldStreamDataSource

ステップ1solrconfig.xml 、 solrがTikaEntityProcessor + DataImportHandler +SolrCellのものを見つけられるように更新してください。

<lib dir="../contrib/dataimporthandler/lib" regex=".*\.jar" />
<!-- will include extras (where TikaEntPro is) and regular DIH -->
<lib dir="../dist/" regex="apache-solr-dataimporthandler-.*\.jar" />
<lib dir="../contrib/extraction/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="apache-solr-cell-\d.*\.jar" />

ステップ2data-config.xml 、 BLOBテーブルを含めるように変更します。バージョンが変更されるにつれてこの問題の解決策が大きく変わっので、これが私が最も問題を抱えた場所です。さらに、複数のデータソースを使用してそれらを正しく接続することは、私には直感的ではありませんでした。一度それが行われると非常に洗練されています。IP、SID名、ユーザー名、パスワード、テーブル名などを必ず置き換えてください。

<dataConfig>
  <dataSource name="dastream" type="FieldStreamDataSource" />
  <dataSource name="db" type="JdbcDataSource"
    driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@192.1.1.1:1521:sid"
    user="username"
    password="password"/>
  <document>
    <entity 
      name="attachments" 
      query="select * from schema.attachment_table"
      dataSource="db">
      <entity 
        name="attachment" 
        dataSource="dastream"
        processor="TikaEntityProcessor"
        url="blob_column"
        dataField="attachments.BLOB_COLUMN"
        format="text">
        <field column="text" name="body" />
      </entity>
    </entity>
    <entity name="unrelated" query="select * from another_table" dataSource="db">
    </entity>
  </document>
</dataConfig>

ここで重要な注意。"No field available for name : whatever"インポートしようとしたときにエラーが発生した場合、FieldStreamDataSourceは指定されたデータフィールド名を解決できません。私urlの場合、小文字の列名のdataField属性と、outside_entity_name.UPPERCASE_BLOB_COLUMNの属性が必要でした。また、列名を間違えると問題が発生します。

ステップ3schema.xml 、 BLOB-columnフィールド(およびインデックス作成/保存する必要のあるその他の列)を追加するようにを変更する必要があります。必要に応じて変更してください。

<field name="body" type="text_en" indexed="false" stored="false" />
<field name="attach_desc" type="text_general" indexed="true" stored="true" />

<field name="text" type="text_en" indexed="true" stored="false" multiValued="true" />
<field name="content" type="text_general" indexed="false" stored="true" multiValued="true" />

<copyField source="body" dest="text" />
<copyField source="body" dest="content" />

これで、Solrでインデックス付けされたデータベース列にBLOBとして格納されているバイナリのリッチテキストドキュメント(別名リッチドキュメント)を取得するために、多くの時間を節約することができます。

于 2013-03-02T03:14:20.330 に答える
2

TikaとDIHの統合は、TikaEntityProcessorを介してSolrですでに提供されています。

統合-SOLR-1358
ブロブ処理-SOLR-1737

適切な組み合わせを見つける必要があります。

于 2013-03-01T03:46:33.213 に答える