第101章 Lucene
Lucene (Indexer および Search)コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel 2.2 で利用可能
lucene コンポーネントは Apache Lucene プロジェクトに基づいています。Apache Lucene は、Java で完全に記述された、高性能でフル機能のテキスト検索エンジンライブラリーです。Lucene の詳細は、以下のリンクを参照してください。
camel の lucene コンポーネントは、エンタープライズ統合パターンおよびシナリオで Lucene エンドポイントの統合および使用状況を容易にします。lucene コンポーネントは以下を行います。
- ペイロードが Lucene エンドポイントに送信される際にドキュメントの検索可能なインデックスを構築します。
- Apache Camel でのインデックス検索の実行を容易にする
このコンポーネントはプロデューサーエンドポイントのみをサポートします。
Camel on EAP デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
lucene:searcherName:insert[?options]
lucene:searcherName:query[?options]
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
オプションの挿入 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
アナライザー
|
StandardAnalyzer
|
Analyzer は、テキストを分析する TokenStreams をビルドします。そのため、テキストからインデックス用語を抽出するポリシーを表します。analyzer の値は、抽象クラス org.apache.lucene.analysis.Analyzer を拡張する任意のクラスにすることができます。Lucene は、追加設定なしで豊富なアナライザーのセットも提供します。 |
indexDir
|
./indexDirectory
|
指定されたアナライザーによるドキュメントの分析時にインデックスファイルが作成されるファイルシステムディレクトリー |
srcDir
|
null
|
プロデューサー起動時にインデックスに分析および追加するために使用されるファイルを含むオプションのディレクトリーです。 |
クエリーオプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
アナライザー
|
StandardAnalyzer
|
Analyzer は、テキストを分析する TokenStreams をビルドします。そのため、テキストからインデックス用語を抽出するポリシーを表します。analyzer の値は、抽象クラス org.apache.lucene.analysis.Analyzer を拡張する任意のクラスにすることができます。Lucene は、追加設定なしで豊富なアナライザーのセットも提供します。 |
indexDir
|
./indexDirectory
|
指定されたアナライザーによるドキュメントの分析時にインデックスファイルが作成されるファイルシステムディレクトリー |
maxHits
|
10
|
検索操作の結果セットを制限する整数値 |
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| ヘッダー | 説明 |
|---|---|
QUERY
|
インデックスで実行される Lucene クエリー。クエリーにはワイルドカードとフレーズが含まれる場合があります。 |
RETURN_LUCENE_DOCS
|
Camel 2.15: ヒット情報を返すときに実際の Lucene ドキュメントを含めるには、このヘッダーを true に設定します。 |
Lucene プロデューサー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、2 つのプロデューサーエンドポイントをサポートします。
- insert - 挿入プロデューサーは、受信エクスチェンジのボディーを分析し、それをトークン(content)に関連付けることで、検索可能なインデックスを構築します。
- query: クエリープロデューサーは、事前に作成されたインデックスで検索を実行します。クエリーは、検索可能なインデックスを使用してスコアおよび関連性ベースの検索を実行します。受信エクスチェンジを介してクエリーを送信すると、QUERY というヘッダープロパティー名が含まれます。ヘッダープロパティー QUERY の値は Lucene クエリーです。Lucene クエリーを作成する方法は、 http://lucene.apache.org/java/3_0_0/queryparsersyntax.html を参照してください。
Lucene プロセッサー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーを作成せずに lucene に対してクエリーを実行できる LuceneQueryProcessor と呼ばれるプロセッサーがあります。
例 1: Lucene インデックスの作成 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start").
to("lucene:whitespaceQuotesIndex:insert?analyzer=#whitespaceAnalyzer&indexDir=#whitespace&srcDir=#load_dir").
to("mock:result");
}
};
例 2: Camel Context の JNDI レジストリーへのプロパティーのロード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry =
new JndiRegistry(createJndiContext());
registry.bind("whitespace", new File("./whitespaceIndexDir"));
registry.bind("load_dir",
new File("src/test/resources/sources"));
registry.bind("whitespaceAnalyzer",
new WhitespaceAnalyzer());
return registry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());
例 2: クエリープロデューサーを使用した検索の実行 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start").
setHeader("QUERY", constant("Seinfeld")).
to("lucene:searchIndex:query?analyzer=#whitespaceAnalyzer&indexDir=#whitespace&maxHits=20").
to("direct:next");
from("direct:next").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Hits hits = exchange.getIn().getBody(Hits.class);
printResults(hits);
}
private void printResults(Hits hits) {
LOG.debug("Number of hits: " + hits.getNumberOfHits());
for (int i = 0; i < hits.getNumberOfHits(); i++) {
LOG.debug("Hit " + i + " Index Location:" + hits.getHit().get(i).getHitLocation());
LOG.debug("Hit " + i + " Score:" + hits.getHit().get(i).getScore());
LOG.debug("Hit " + i + " Data:" + hits.getHit().get(i).getData());
}
}
}).to("mock:searchResult");
}
};
例 3: クエリープロセッサーを使用した検索の実行 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
RouteBuilder builder = new RouteBuilder() {
public void configure() {
try {
from("direct:start").
setHeader("QUERY", constant("Rodney Dangerfield")).
process(new LuceneQueryProcessor("target/stdindexDir", analyzer, null, 20)).
to("direct:next");
} catch (Exception e) {
e.printStackTrace();
}
from("direct:next").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Hits hits = exchange.getIn().getBody(Hits.class);
printResults(hits);
}
private void printResults(Hits hits) {
LOG.debug("Number of hits: " + hits.getNumberOfHits());
for (int i = 0; i < hits.getNumberOfHits(); i++) {
LOG.debug("Hit " + i + " Index Location:" + hits.getHit().get(i).getHitLocation());
LOG.debug("Hit " + i + " Score:" + hits.getHit().get(i).getScore());
LOG.debug("Hit " + i + " Data:" + hits.getHit().get(i).getData());
}
}
}).to("mock:searchResult");
}
};