2011-12-20 12 views
13

私は現在、luceneを使用してウェブページを索引付けしています。目的は、特定の式(通常1,2または3ワード)を含むページを抽出し、他の単語(またはそれらの1〜3つのグループ)もページに含まれているページをすばやく抽出できるようにすることです。 シソーラス(固定語彙)を構築/強化/変更するために使用されます。フレーズクエリとシングルフィルタを使用する違いは何ですか?

私が見つけた記事から、問題はn-grams(またはうねり)を見つけることであるようです。

LuceneはShingleFilter,ShingleMatrixFilterおよびShingleAnalyzerWrapperであり、このタスクに関連しているようです。

このpresentationから、Luceneは固定数の単語(スロープと呼ばれる)で区切られた語を検索することもできることを知りました。例はhereです。

しかし、私は明らかにそのアプローチの違いを理解していないのですか?それらは根本的に異なるのですか、それともパフォーマンス/インデックスのサイズの選択ですか?

ShingleMatrixFilterとShingleFilterの違いは何ですか?

希望するLuceneの達人がこの質問を見つけて答えてくれます;-)!

答えて

17

フレーズとシングルの使用の違いは、主にパフォーマンスとスコアリングにあります。

フレーズ検索を使用する場合は、フレーズクエリは「foo」というために転置インデックスを歩かなければならないと「bar」のために、単一の単語がインデックスにある典型的な場合(「FOOバー」と言う)とが含まれるドキュメントを検索しますそれらの文書のそれぞれの中で彼らの位置リストを歩いて、 "bar"の直前に "foo"が現れた場所を見つけます。

これは、パフォーマンスとスコアリングの両方にいくつかのコストを持っています

  1. ポジション(.prx)インデックス付けと検索、これはインデックス作成と検索時間が増加します転置インデックスに追加の「次元」のようなものであるしなければなりません
  2. 逆索引には個々の用語しか表示されないため、実際の「フレーズIDF」は計算されません(これはあなたには影響しません)。したがって、これは、用語IDFの合計に基づいて概算されます。

一方、帯状疱疹を使用すると、単語nグラムの索引付けも行われます。言い換えれば、サイズ2までシングリングすると、「foo bar」のような語句もインデックス。つまり、このフレーズクエリでは、単純なTermQueryとして解析され、位置リストを使用しません。そして、現在の「実質の用語」から、この「用語」がどれくらいの数の文書が存在するのか正確に分かっているので、IDFというフレーズは正確です。

しかし、帯状疱疹を使用しても同様に、いくつかのコストを持っている:完全Field.setIndexOptionsとあなたを完全に無効な位置ならば、これは特に公正なトレードオフかもしれませんが

  1. は、用語辞書、用語インデックス、およびポスティングリストのサイズを増加しました。
  2. インデックス作成の分析段階での追加費用:ShingleFilterはきれいに最適化され、かなり高速です。
  3. "愚かなフレーズクエリ"や不正確なフレーズマッチを計算する明白な方法はありませんが、これは近似することができます。"foo bar baz"というフレーズのサイズが2の場合、foo_bar、bar_bazの2つのトークンがあり、不正確な近似のためにluceneの他のクエリ(BooleanQueryなど)を使って検索を実装できます。帯状疱疹またはCommonGramsのようなもので、一般的な、インデックスワードngramsで

は、位置クエリのコストを削減したり、フレーズの得点を強化するために、ちょうどトレードオフ(かなりの専門家)です。

しかし、実際の使用例は、このようなもののために存在し、良い例がここにあります:(受け入れ)この詳細な回答のため http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2

+0

感謝。 ShingleFilterとShingleMatrixFilterの違いについてコメントできましたか? – blackbox

+0

本当にいい説明。 この記事では、いくつかの手で帯状疱疹を理解するのに役立ちました:https://www.elastic.co/blog/searching-with-shingles – krinker

関連する問題