Solrは、WebサービスのようなAPIインターフェイスを提供する独立したエンタープライズレベルの検索アプリケーションサーバーです。ユーザーは、特定の形式のXMLファイルをHTTPリクエストを介して検索エンジンサーバーに送信し、インデックスを生成できます。また、HTTP Get Operationsを介して検索リクエストを送信し、XML/JSON形式で戻り結果を取得することもできます。 Luceneに基づいたJava5を使用して開発されました。
Luceneは、Apache Software Foundationの4ジャカルタプロジェクトチームのサブプロジェクトです。これは、オープンソースのフルテキスト検索エンジンツールキットです。つまり、完全なフルテキスト検索エンジンではなく、フルテキスト検索エンジンアーキテクチャであり、完全なクエリエンジンとインデックスエンジンと部分的なテキスト分析エンジン(英語とドイツの西部言語)を提供します。
その中で、ルーセンのフルテキスト検索の基本原則は、Guo Jundaniuが教えたWeb検索コースのテクノロジーと一致しています。単語セグメンテーション、セマンティック文法分析、ベクトル空間モデル、その他の技術を使用してそれを実現します。以下は、より詳細なブログ投稿メモ:http://www.cnblogs.com/guochunguang/articles/3641008.html
1。一般的な議論
http://lucene.apache.org/java/docs/index.htmlによる定義:
ルーセンは、効率的なJavaベースのフルテキスト検索ライブラリです。
したがって、ルーセンを理解する前に、フルテキスト検索について学ぶために時間をかけなければなりません。
では、フルテキスト検索とは何ですか?これは私たちの生活の中のデータから始まります。
私たちの生活のデータは、一般に、構造化データと非構造化データの2つのタイプに分けられます。
•構造化されたデータ:データベース、メタデータなど、固定形式または有限長のデータを指します。
•構造化されていないデータ:電子メール、単語文書など、固定形式が不確実であるか、固定形式がないデータを指します。
もちろん、一部の場所では、構造化されたデータに従って処理できる場合、または非構造化データとして処理するためにプレーンテキストを抽出できる場合、XML、HTMLなどの3番目のタイプの半構造化データについても言及します。
非構造化データは、フルテキストデータとも呼ばれます。
データの分類によると、検索は2つのタイプにも分けられます。
•構造化されたデータの検索:たとえば、データベースの検索、SQLステートメントを使用します。たとえば、Windows検索を使用してファイル名、タイプ、変更時間などを検索するなど、メタデータの検索。
•非構造化データの検索:たとえば、Windowsを検索すると、ファイルコンテンツ、Linuxの下でGREPコマンドを検索することもできます。たとえば、GoogleとBaiduを使用すると、大量のコンテンツデータを検索できます。
構造化されていないデータを検索するための2つの主な方法、つまりフルテキストデータがあります。
1つはシリアルスキャンです。たとえば、一定の文字列を持つファイルを探すためのいわゆるシーケンシャルスキャンは、一度に各ドキュメントを見ることです。各ドキュメントについては、最初から最後まで参照してください。このドキュメントにこの文字列が含まれている場合、このドキュメントは探しているファイルであり、すべてのファイルがスキャンされるまで次のファイルを調べます。 Windowsを使用して検索すると、ファイルコンテンツを検索することもできますが、非常に遅いです。 80gのハードドライブがある場合は、特定の文字列が付いたファイルを見つけたい場合は、数時間かけずにそれを行うことができないのではないかと心配しています。これは、Linuxの下でのGREPコマンドの場合も同じです。この方法は比較的原始的だと思うかもしれませんが、データ量が少ないファイルの場合、この方法は依然として最も直接的で便利です。しかし、多数のファイルの場合、この方法は非常に遅いです。
一部の人々は、構造化されていないデータの連続スキャンは非常に遅いと言うかもしれませんが、構造化されたデータの検索は比較的高速です(構造化されたデータには特定の構造があるため、特定の検索アルゴリズムを使用して速度を上げることができます)。
このアイデアは自然なものですが、フルテキスト検索の基本的なアイデアを形成します。これは、非構造化データの情報の一部を抽出し、それを再編成して特定の構造を持ち、特定の構造でデータを検索して、比較的迅速に検索する目的を達成することです。
非構造化データから抽出され、その後再編成された情報のこの部分は、インデックスと呼ばれます。
この声明は比較的抽象的であり、いくつかの例を挙げると理解するのは簡単です。たとえば、辞書、ピンインテーブル、および辞書のラジカルチェック文字テーブルは、辞書のインデックスと同等です。各文字の説明は構造化されていません。辞書に音節テーブルとラジカルチェックキャラクターテーブルがない場合は、広大な言葉の海でのみスキャンできます。ただし、単語のいくつかの情報を構造化処理のために抽出できます。たとえば、発音は比較的構造化されており、イニシャルとファイナルに分割されており、1つずつリストできるタイプはごくわずかです。したがって、発音は特定されて特定の順序で配置され、各発音はこの単語の詳細な説明のページ数を指します。検索するとき、構造化されたピンインに従って発音を検索し、非構造化されたデータ、つまり単語の説明を見つけることができます。
最初にインデックスを作成し、次にインデックスを検索するこのプロセスは、フルテキスト検索と呼ばれます。
以下の写真は「Lucene in Action」からのものですが、Luceneの検索プロセスを説明するだけでなく、フルテキスト検索の一般的なプロセスについても説明しています。
フルテキスト検索は、通常、インデックス作成(インデックス作成)と検索インデックス(検索)の2つのプロセスに分けられます。
•インデックス作成:現実世界のすべての構造化された構造化および非構造化データから情報を抽出し、インデックスの作成プロセス。
•インデックスの検索:ユーザーのクエリ要求を取得し、作成されたインデックスを検索してから結果を返すプロセスです。
したがって、全文検索には3つの重要な問題があります。
1.インデックスには何が正確に存在しますか? (索引)
2。インデックスを作成する方法は? (インデックス作成)
3.インデックスを検索する方法は? (検索)
以下では、各問題を順番に研究します。
2。インデックスに正確に存在するもの
インデックスに正確に保存する必要があるものは何ですか?
まず、シーケンシャルスキャン速度が遅い理由を見てみましょう。
実際、検索する情報と非構造化データに保存されている情報との間の矛盾が原因です。
非構造化されたデータに保存されている情報は、各ファイルに含まれる文字列、つまり既知のファイル、つまり、ファイルから文字列へのマッピングを検索するのが比較的簡単です。検索したい情報は、どのファイルがこの文字列、つまり既知の文字列と目的のファイル、つまり文字列からファイルへのマッピングを含むかです。 2つはまったく逆です。したがって、インデックスが常に文字列からファイルへのマッピングを常に保存できる場合、検索速度は大幅に改善されます。
文字列からファイルへのマッピングはファイルの逆プロセスであるため、そのような情報を保存するインデックスはリバースインデックスと呼ばれます。
逆インデックスの保存された情報は、一般に次のとおりです。
私のドキュメントコレクションには100のドキュメントがあるとします。便利なため、ドキュメントを1から100に番号付けし、次の構造を取得します。
左側には、辞書と呼ばれる一連の文字列があります。
各文字列は、投稿リストと呼ばれるこの文字列を含むドキュメントリンクリストを指しています。
インデックス作成により、保存された情報は検索する情報と一致しており、検索を大幅に高速化できます。
たとえば、文字列「ルーセン」と文字列「solr」の両方を含むドキュメントを見つけたい場合は、次の手順のみが必要です。
1.文字列「Lucene」を含むドキュメントリンクリストを削除します。
2。文字列「solr」を含むドキュメントリンクリストを削除します。
3。リンクリストを組み合わせて、「Lucene」と「solr」の両方を含むファイルを見つけます。
この場所を見ると、一部の人々は、フルテキスト検索で検索をスピードアップすると言うかもしれませんが、追加のインデックス作成のプロセスにより、2つはシーケンシャルスキャンよりもはるかに高速ではないかもしれません。実際、インデックス作成プロセスでは、特にデータボリュームが小さい場合、フルテキストの検索は、シーケンシャルスキャンよりも必ずしも高速ではありません。大量のデータにインデックスを作成することも非常に遅いプロセスです。
ただし、2つにはまだ違いがあります。シーケンシャルスキャンは毎回スキャンであり、インデックスを作成するプロセスは完全に必要です。各検索、インデックスを作成するプロセスは、作成されたインデックスを検索するだけで、通過する必要はありません。
これは、シーケンシャルスキャン上のフルテキスト検索の利点の1つでもあり、複数回使用して、1回インデックス作成です。
3.インデックスの作成方法
フルテキスト検索のインデックス作成プロセスには、一般に次の手順があります。
ステップ1:インデックス作成されるいくつかの元のドキュメント(ドキュメント)。
インデックス作成プロセスの説明を容易にするために、2つのファイルを例として使用します。
ファイル1:生徒は友達と一緒に出かけることを許可されるべきですが、ビールを飲むことは許可されていません。
ファイル2:私の友人のジェリーは彼の生徒に会うために学校に行きましたが、彼らは酔っていることがわかりましたが、それは許可されていません。
ステップ2:元のドキュメントをトークンザーに渡します。
分詞コンポーネント(トークネイザー)は次のことを行います(このプロセスはトークン化と呼ばれます)。
1.ドキュメントを別々の単語に分割します。
2。句読点を取り外します。
3.ストップワードを削除します。
いわゆるストップワードは、言語で最も一般的な単語の一部です。特別な意味がないため、ほとんどの場合、検索キーワードになることはできません。したがって、インデックスを作成すると、この単語が削除され、インデックスのサイズが縮小されます。
「the "、" a "、" this "などの英語の停止単語
各言語のトークナイザーには、一連の停止単語があります。
単語分詞(トークネイザー)の後に得られた結果は、単語要素と呼ばれます。
この例では、次の単語要素(トークン)を取得します。
「生徒」、「許可」、「ゴー」、「彼ら」、「友人」、「許可」、「飲み」、「飲み物」、「ビール」、「私の」、「友人」、「ジェリー」、「ゴット」、「学校」、「シー」、「彼」、「生徒」、「ファンド」、「酔っ払った」、「許可」。
ステップ3:取得したトークンを言語処理コンポーネント(言語プロセッサ)に渡します。
言語処理コンポーネント(言語プロセッサ)は、主に結果の単語要素(トークン)を扱います。
英語の場合、言語処理コンポーネント(言語プロセッサ)は一般に次のことを行います。
1。小文字(小文字)に変更します。
2。「車」から「車」などのルート形式に単語を削減します。この操作は、ステムと呼ばれます。
3.単語を「ドライブ」などのルート形式に変換します。この操作はlemmatizationと呼ばれます。
茎とlemmatizationの類似点と相違点:
•対称:ステムとlemmatizationはどちらも語彙をルート形式にします。
•2つの方法は異なります。
◦造影は、「削減」方法を採用します:「車」から「車」、「ドライブ」への「運転」。
◦再変数は、「変換」方法を採用します。「ドライブ」、「ドライブ」、「ドライブ」に「運転」します。
•2つのアルゴリズムは異なります。
◦測定は、主に「s」を削除し、「in」を削除し、「e」を削除し、「ate」を「ate」に変更し、「」に「「e」」を変更するなど、この削減を行うためにいくつかの固定アルゴリズムを採用します。
◦再配置は、主に特定の辞書を保存する方法を使用してこの変換を行います。たとえば、「ドライビング」から「ドライブ」、「ドライブ」、「ドライブ」、「am、is、 "to" be "へのマッピングがあります。変換するときは、辞書を調べてください。
•ステムとlemmatizationは相互に排他的な関係ではなく、交差点があります。いくつかの単語は、両方の方法を使用して同じ変換を実現できます。
言語プロセッサの結果は用語と呼ばれます。
私たちの例では、言語処理後、得られた単語(用語)は次のとおりです。
「生徒」、「許可」、「ゴー」、「彼らの」、「友人」、「許容」、「飲み」、「飲み物」、「ビール」、「私の」、「友人」、「ジェリー」、「ゴー」、「学校」、「シー」、「彼」、「生徒」、「ファインド」、「彼ら」、「ドリンク」、「許容」。
これはまさに、ドライブの検索を検索し、ドライブを検索することができる言語処理手順のためです。
ステップ4:取得した単語(用語)をインデックスコンポーネント(インデクサー)に渡します。
インデクサーは主に次のことを行います。
1.結果の単語(用語)を使用して辞書を作成します。
この例では、辞書は次のとおりです。
学期 | ドキュメントID |
学生 | 1 |
許可する | 1 |
行く | 1 |
彼らの | 1 |
友達 | 1 |
許可する | 1 |
飲む | 1 |
ビール | 1 |
私の | 2 |
友達 | 2 |
ジェリー | 2 |
行く | 2 |
学校 | 2 |
見る | 2 |
彼の | 2 |
学生 | 2 |
探す | 2 |
彼らは | 2 |
飲む | 2 |
許可する | 2 |
2。辞書をアルファベット順に並べ替えます。
学期 | ドキュメントID |
許可する | 1 |
許可する | 1 |
許可する | 2 |
ビール | 1 |
飲む | 1 |
飲む | 2 |
探す | 2 |
友達 | 1 |
友達 | 2 |
行く | 1 |
行く | 2 |
彼の | 2 |
ジェリー | 2 |
私の | 2 |
学校 | 2 |
見る | 2 |
学生 | 1 |
学生 | 2 |
彼らの | 1 |
彼らは | 2 |
•ドキュメントの頻度とは、この単語(用語)を含むファイルの数を示すドキュメントの頻度を意味します。
•頻度とは、単語の周波数を意味します。つまり、このファイルにはいくつかの単語(用語)が含まれています。
したがって、「許可」という単語の場合、この単語(用語)を含む2つのドキュメントがあります。そのため、単語(用語)の後にドキュメントリストに次の2つのドキュメントがあります。最初の項目は、「許可」、つまりドキュメント1を含む最初のドキュメントを表します。このドキュメントでは、「許可」が2回表示され、2番目の項目は「許可」を含む2番目のドキュメントを表します。
これまでのところ、インデックスが作成されており、必要なドキュメントをすばやく見つけることができます。
そしてその過程で、「ドライブ」、「運転」、「ドライブ」、「ドライブ」の検索も見つけることができることに驚きました。インデックスでは、「運転」、「運転」、「駆動」はすべて言語を通じて処理され、「ドライブ」になるからです。検索するとき、「運転」を入力すると、入力されたクエリステートメントもここで1〜3つのステップを通過し、「ドライブ」というクエリになり、目的のドキュメントを検索できます。
3.インデックスを検索する方法は?
「私たちが望むドキュメントを見つけた」ことを発表できるようです。
しかし、問題は終わっておらず、全文検索の1つの側面にすぎないことがわかりました。そうじゃない?クエリの文字列が1つまたは10文字しか含まれていない場合、それらを見つけました。しかし、1000人、あるいは数千人がいる場合はどうなりますか?あなたが一番欲しいファイルはどれですか?
たとえば、Googleを開きます。たとえば、Microsoftで仕事を見つけたい場合は、「Microsoft Job」を入力すると、合計22600,000の結果が返されます。なんて大きな数字で、突然発見されていないことが突然発見され、多くの問題も問題でした。非常に多くの結果が得られると、どのようにして最も関連性の高いものを最初に置くのですか?
もちろん、Googleは良い仕事をしています。Microsoftで一度に仕事を見つけることができます。最初の数人がすべて「マイクロソフトがソフトウェア業界で良い仕事をしている」としたらどれほどひどいことだろうか想像してみてください。
Googleのような何千もの検索結果の中から最も関連性の高いクエリステートメントを見つける方法は?
検索されたドキュメントとクエリステートメントとの相関関係を判断するにはどうすればよいですか?
これは、3番目の質問に戻ります。インデックスを検索する方法は?
検索は主に次の手順に分かれています。
ステップ1:ユーザーはクエリステートメントを入力します。
クエリステートメントには、通常の言語と同様に、特定の構文があります。
SQLステートメントには特定の構文があるなど、異なるクエリステートメントには異なる構文があります。
クエリステートメントの構文は、フルテキスト検索システムの実装によって異なります。最も基本的なものには、次のものが含まれます。
たとえば、ユーザー入力ステートメント:Luceneと学習Hadoop。
ユーザーは、ルーセンを含み、学んだがHadoopが含まれていないドキュメントを見つけたいと考えています。
ステップ2:クエリステートメントの語彙分析、文法分析、および言語処理を実行します。
クエリステートメントには構文があるため、文法分析、文法分析、言語処理を実行することも必要です。
1.語彙分析は、主に単語とキーワードを識別するために使用されます。
上記の例のように、語彙分析の後、単語にはルーセン、学習、Hadoop、およびキーワードが含まれます。
語彙分析で違法なキーワードが見つかった場合、エラーが発生します。たとえば、Lucene AMDは、ANDの間違いのために通常の単語としてのクエリに関与していることを学びました。
2。構文分析は、主にクエリステートメントの文法規則に基づいて構文ツリーを形成します。
クエリステートメントが構文ルールを満たしていないことがわかった場合、エラーが報告されます。 Luceneがそうでない場合、学習した場合、エラーが発生します。
上記の例のように、Luceneによって形成され、Hadoopではないことを学んだ構文ツリーは次のとおりです。
3。言語処理は、インデックス作成中の言語処理とほぼ同じです。
たとえば、学習は学習されるなどになります。
2番目のステップの後、言語処理された構文ツリーを取得します。
ステップ3:インデックスを検索し、構文ツリーに一致するドキュメントを取得します。
このステップは、いくつかの小さなステップに分かれています。
1.最初に、逆インデックステーブルで、Lucene、Learn、およびHadoopを含むドキュメントリンクリストを見つけます。
2.第二に、ルーセンを含むリンクされたリストをマージし、ルーセンと学習の両方を含むドキュメントリンクリストを取得することを学習します。
3.次に、このリンクリストとHadoopのドキュメントリンクリストの違いを実行し、Hadoopを含むドキュメントを削除して、Luceneを含むドキュメントリンクリストを取得し、Hadoopを学習していない。
4.このドキュメントリンクリストは、私たちが探しているドキュメントです。
ステップ4:取得したドキュメントとクエリステートメントの間の相関に基づいて結果を並べ替えます。
前のステップでは、目的のドキュメントを取得しましたが、クエリの結果はクエリステートメントとの相関関係によってソートされる必要があり、関連性が高いほど、それは高くなります。
ドキュメントとクエリステートメント間の相関を計算する方法は?
クエリステートメントを短いドキュメントと見なし、ドキュメント間の関連性を獲得することをお勧めします。高いスコアとの相関が良好な場合は、最初にランク付けする必要があります。
では、ドキュメント間の関係をどのように評価しますか?
これは簡単な作業ではありません。まず、人々の関係を判断することを見てみましょう。
まず第一に、人を見ると、性格、信念、趣味、衣服、身長、脂肪、薄さなど、多くの要素がしばしばあります。
第二に、人々の関係については、異なる要素が重要であることが異なります。キャラクター、信念、趣味がより重要な場合があります。衣服、身長、脂肪はそれほど重要ではないかもしれません。したがって、同じまたは似た性格、信念、趣味を持つ人々は良い友達になる可能性が高くなりますが、衣服、身長、脂肪、薄さは異なる人も良い友達になることがあります。
したがって、人々の間の関係を判断するとき、最初に、人格、信念、趣味など、人々の関係にとってどの要素が最も重要であるかを見つけなければなりません。第二に、私たちは2人のこれらの要素間の関係を判断する必要があります。たとえば、1人は陽気な性格を持ち、もう1人は外向的な個性を持ち、1人は仏教を信じ、もう1人は神を信じ、一人はバスケットボールをするのが大好きです。私たちは、どちらも人格の面で非常に前向きであり、信仰の点で親切で、趣味の点でスポーツであることがわかりました。そのため、それらの関係は非常に良いはずです。
企業間の関係を見てみましょう。
まず、ゼネラルマネージャー、マネージャー、最高技術責任者、普通の従業員、警備員、ドアマンなどの多くの人々で構成される会社を見てください。
第二に、異なる人々は、企業間の関係にとって異なる重要性を持っています。ゼネラルマネージャー、マネージャー、および最高技術責任者がより重要である可能性があり、普通の従業員、警備員、およびドアマンはそれほど重要ではない場合があります。したがって、2社のゼネラルマネージャー、マネージャー、最高技術責任者の関係が比較的優れている場合、両社はより良い関係を築く傾向があります。ただし、普通の従業員が別の会社の普通の従業員と深い憎しみを持っている場合でも、それが両社間の関係に影響を与える可能性は低いです。
したがって、会社間の関係を判断するには、まず、ゼネラルマネージャー、マネージャー、最高技術責任者など、会社間の関係にとって誰が最も重要であるかを見つけなければなりません。第二に、これらの人々の関係を判断する必要があります。これは、両社のゼネラルマネージャーほど良くありません。マネージャーは仲間の村人であり、最高技術責任者はかつて起業家のパートナーです。ゼネラルマネージャー、マネージャー、または最高技術責任者であろうと、両社間の関係は良好であるため、両社間の関係は良いはずです。
2つの関係を分析した後、ドキュメント間の関係を判断する方法を見てみましょう。
まず、ドキュメントは、検索、ルーセン、フルテキスト、これ、a、whatなど、多くの単語(用語)で構成されています。
第二に、異なる用語は、ドキュメント間の関係にとって異なる重要性を持っています。たとえば、このドキュメント、検索、ルーセン、フルテキストは比較的重要です。これは比較的重要ではないかもしれません。したがって、両方のドキュメントに検索、Lucene、およびFullTextが含まれている場合、これら2つのドキュメント間の相関が優れています。ただし、1つのドキュメントがこれに含まれていても、a、何、および他のドキュメントにこれが含まれていない場合でも、これは2つのドキュメント間の相関に影響することはできません。
したがって、ドキュメント間の関係を判断するために、まず、検索、ルーセン、フルテキストなどのドキュメント間の関係にとって、どの単語(用語)が最も重要であるかを見つけます。次に、これらの単語(用語)間の関係を判断します。
ドキュメントに対する単語(用語)の重要性を見つけるプロセスは、単語の重みを計算するプロセスと呼ばれます。
重量という用語を計算する2つのパラメーターがあります。 1つ目は単語(用語)で、2つ目はドキュメント(ドキュメント)です。
単語の重みは、このドキュメントのこの単語の重要性を示しています。単語(用語)がより重要なほど、重量(用語の重量)が大きくなるため、ドキュメント間の相関を計算する上で大きな役割が果たされます。
単語(用語)としたがってドキュメント相関の取得間の関係を判断するプロセスは、ベクトル空間モデルアルゴリズム(ベクトル空間モデル)の使用に使用されます。
これらの2つのプロセスを慎重に分析しましょう。
1.重量を計算するプロセス(用語重量)。
ドキュメントの単語(用語)の重要性に影響を与える2つの主な要因があります。
•用語頻度(TF):これは、このドキュメントにこの用語が何回表示されるかです。 TFが大きければ大きいほど、意味があります。
•ドキュメント頻度(DF):つまり、二次用語を含むドキュメントの数。 DFが大きいほど、意味が低くなります。
理解しやすいですか?ドキュメントに単語(用語)が表示されるほど、ドキュメントにとってより重要になります。たとえば、このドキュメントには「検索」という言葉が何度も表示されます。つまり、このドキュメントは主にこの側面について説明しています。しかし、英語の文書では、これがより頻繁に表示される場合、それがより重要であることを意味しますか?いいえ、これは2番目の要因によって調整されます。 2番目の要因は、より多くのドキュメントがこの単語(用語)を含むほど、単語(用語)が普通であり、これらのドキュメントを区別するには十分ではないことを意味するため、それはそれほど重要ではないことを意味します。
これは、プログラマーが学ぶテクノロジーでもあります。プログラマ自身にとって、彼らがこのテクノロジーをより深く習得すればするほど、より良い(より深くマスターすることは、彼らが費やす時間が長く、TFが大きくなることを意味します)、そして彼らが仕事を探しているとき、彼らはより競争力があります。しかし、すべてのプログラマーにとって、この技術を理解する人が少なくなるほど、より良い(それを理解する人は少なくなります)、彼らが仕事を見つける際により競争が激しくなります。これが、人間の価値がかけがえのあるものにある理由です。
真実が理解されたら、式を見てみましょう。
これは、用語重量計算式の単純な典型的な実装です。フルテキスト検索システムを実装する人は独自の実装を持ち、ルーセンはこれとはわずかに異なります。
2。用語とドキュメント相関の取得との関係を判断するプロセス、つまりベクトル空間モデルのアルゴリズム(VSM)。
ドキュメントは一連の単語(用語)と見なされ、各単語(用語)は重量(用語の重量)を持ち、異なる単語(用語)は、ドキュメント内の独自の重量に基づくドキュメント関連のスコアリング計算に影響します。
したがって、このドキュメントの用語の重みはベクトルと見なします。
document = {term1、term2、…、term n}
documentvector = {weight1、weight2、...、weight n}
同様に、クエリステートメントを簡単なドキュメントと見なし、ベクトルでも表現します。
query = {Term1、Term 2、…、Term n}
クエリvector = {weight1、weight2、...、weight n}
検索されたすべてのドキュメントベクトルとクエリベクトルをn次元空間に配置し、各単語(用語)は1次元です。
写真に示されているように:
2つのベクトル間の角度が小さいほど、相関が大きくなると考えています。
したがって、相関のスコアとして含まれる角度のコサイン値を計算します。角度が小さいほど、コサイン値が大きくなり、スコアが高くなり、相関が大きくなります。
一部の人々は、クエリステートメントは一般に非常に短く、非常に少ない単語(用語)を含むように尋ねるかもしれません。そのため、クエリベクトルの寸法は非常に小さく、ドキュメントは非常に長く、多くの単語(用語)が含まれ、ドキュメントベクトルの寸法は非常に大きいです。グラフnに両方の寸法があるのはなぜですか?
ここでは、同じベクトル空間に置きたいので、自然な寸法は同じです。同時に違うには、2つの連合を取ります。単語(用語)がない場合、重量(用語の重量)は0です。
相関スコアリング式は次のとおりです。
たとえば、クエリステートメントには11用語があり、3つのドキュメントが検索されます。それぞれの重み(用語重量)は次のとおりです。
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 | |
D1 | 0 | 0 | .477 | 0 | .477 | .176 | 0 | 0 | 0 | .176 | 0 |
D2 | 0 | .176 | 0 | .477 | 0 | 0 | 0 | 0 | .954 | 0 | .176 |
D3 | 0 | .176 | 0 | 0 | 0 | .176 | 0 | 0 | 0 | .176 | .176 |
Q | 0 | 0 | 0 | 0 | 0 | .176 | 0 | 0 | .477 | 0 | .176 |
したがって、3つのドキュメントとクエリステートメントの間の相関スコアは、次のように計算されます。
したがって、ドキュメント2の相関が最も高く、最初に戻り、次にドキュメント1が続き、最後にドキュメント3が続きます。
これまでのところ、私たちが最も望んでいるドキュメントを見つけることができます。
多くのことを言って、私はまだルーセンに入っていませんが、それは情報検索の基本理論にすぎません。しかし、ルーセンを見た後、ルーセンはこの基本理論の基本的な慣行であることがわかります。したがって、ルーセンを分析する記事では、ルーセンで上記の理論の適用がよく見られます。
ルーセンに入る前に、上記のインデックスの作成と検索プロセスの要約は、図に示されているとおりです。
この図は、http://www.lucene.com.cn/about.htmの記事「ルーセン、オープンソースコードの全文検索エンジン」を指します。
1。インデックスプロセス:
1)一連のインデックス化されたファイルがあります
2)インデックス化されたファイルは、構文分析と言語処理の一連の単語(用語)を形成します。
3)インデックスを介して辞書と逆インデックステーブルを作成します。
4)インデックスストレージを介してハードディスクのインデックスを書き込みます。
2。検索プロセス:
a)ユーザー入力クエリステートメント。
b)一連の単語(用語)は、クエリステートメントの文法分析と言語分析を通じて取得されます。
c)構文分析によりクエリツリーを取得します。
d)インデックスストレージを介してインデックスをメモリに読み取ります。
e)クエリツリーを使用してインデックスを検索して、各単語(用語)のドキュメントリンクリストを取得し、ドキュメントリンクリストを送信し、結果ドキュメントを取得します。
f)検索された結果ドキュメントをクエリの関連性に並べ替えます。
g)クエリ結果をユーザーに返します。
2。辞書をアルファベット順に並べ替えます。
学期 | ドキュメントID |
許可する | 1 |
許可する | 1 |
許可する | 2 |
ビール | 1 |
飲む | 1 |
飲む | 2 |
探す | 2 |
友達 | 1 |
友達 | 2 |
行く | 1 |
行く | 2 |
彼の | 2 |
ジェリー | 2 |
私の | 2 |
学校 | 2 |
見る | 2 |
学生 | 1 |
学生 | 2 |
彼らの | 1 |
彼らは | 2 |
3.同じ単語(用語)をドキュメントリバース(投稿リスト)リンクリストにマージします。
この表には、いくつかの定義があります。