2013-06-20 4 views
5

私は比較的小さな文書/文章のインデックスを作成するプロジェクトに取り組んでおり、大きな文書をクエリとして使用してこれらのインデックスを検索したいと考えています。ここでは、比較的簡単な例です: 私はドキュメントのインデックスを作成しています:Luceneの比較的小さなインデックス文書で大きな検索クエリを処理する

docId : 1 
text: "back to black" 

を、私は次の入力を使用して照会する:

"Released on 25 July 1980, Back in Black was the first AC/DC album recorded without former lead singer Bon Scott, who died on 19 February at the age of 33, and was dedicated to him." 

のLuceneで、このための最善のアプローチは何ですか?私が探したいテキストがの場合、入力クエリは、私は自分のアナライザ+ PhraseQueryを使った方が良い結果を得ました。QueryParser.parse(QueryParser.escape(... my large input ...) )) - 大きなブール/タームクエリーが作成されてしまいます。

実際の世界の例でPhraseQueryのアプローチを使用しようとすることはできません。ShingleAnalyzerWrapperのような単語Nグラムのアプローチを使用する必要があると思いますが、入力文書がかなり大きくなるため、言い換えれば...

を処理するために、私はこだわっていると任意のアイデアをいただければ幸いです:)

PS私は言及しませんでしたが、小さな文書の索引付けをする厄介なことの1つは、「ノルム」 - 値(浮動小数点数)のみが1バイトでエンコードされているためです。3-4語のすべての文が同じノルム値を取得するため、 「ABC」のような文章では、結果「ABC」と「ABCD」が同じスコアで表示されます。

ありがとうございます!

答えて

2

文章数はわかりませんが、文章をクエリとして保存し、受信文書をtransient in-memory indexに索引付けしてすべてのクエリを実行し、一致するものを検索してください。

(注:これはどのようにElasticsearchのpercolator作品である。)

編集(2013年6月21日)

あなたは文章の非常に多くを持っている場合、それはまだに良いかもしれません文章を索引に格納する。ただし、フレーズクエリを使用する代わりに、LuceneのShingleFilterを使用してインデックスを作成できます。クエリ時には、QueryParserを使用する代わりに手動でクエリを構築する方法が適していますが、ターゲットをインデックス化すると、各節がフレーズクエリの代わりにシングルと一致する純粋なブールクエリを作成できます。

+0

ええ、私はそれについて考えましたが、一致する200k文以上あり、私の最初のテスト(インメモリインデックスを使用しない)はかなり遅かったです。しかし、それは正しいアプローチです、私はelasticsearchがそれを行う方法をチェックします:)あなたは適切なクエリで他の方法で動作させることができないと思いますか? –

関連する問題