分散Luceneの概要
Note
この機能は NCache Enterprise & 専門 パーティション化されたトポロジ のみ。
NCache 提供 ルセン モジュールを使用すると、Lucene を使用してテキスト検索を行うことができます。 NCache。 各サーバーの NCache 専用の Lucene モジュールがあります。 これにより、Lucene は分散型でスケーラブルになり、可用性が高くなります。 NCache.
Note
NCache Lucene.Net の 4.8 バージョンを使用します。
Luceneを使用する理由 NCache?
ご存知のとおり、Lucene は強力かつ効率的な検索エンジンであり、ビジネス要件を満たす幅広いテキスト検索技術を提供します。 Lucene は、ユーザーに与えられる選択肢が複数あるため、他のテキスト検索エンジンよりも優れています。 強力な検索アルゴリズムを備えており、幅広い検索クエリをサポートしています。
Lucene はそれ自体でも強力ですが、限界があります。 Lucene はクライアント アプリケーションでインプロセスで実行されます。 これは、Lucene にはスケーラビリティがなく、単一障害点があることを意味します。
NCache API に若干の変更を加えた Lucene の分散実装を提供します。 Lucene の API 呼び出し NCache バックエンドで。 NCache Luceneを使用して本質的に分散されると、アプリケーションによってインデックスが作成されたドキュメントがキャッシュノード間で自動的に分散され、個別にインデックスが作成されるため、線形の書き込みスケーラビリティが提供されます。
Note
分散 Lucene は、 NCache キャッシュストア。
同様に、Distributed Lucene は、クエリが各パーティションに伝播され、結果がマージされるため、線形読み取りスケーラビリティも提供します。 パーティションの数が多いほど、読み取りおよび書き込みのスケーラビリティが高くなります。 Lucene インデックスは物理ドライブに保存されます。 ノードが多いほど、スケーラビリティ、パフォーマンス、ストレージ容量が向上し、大量の Lucene ドキュメントとインデックス付きデータに対応できます。
分散 Lucene の仕組み
重要
Lucene ドキュメントのインデックス作成と検索には、HDD ではなく SSD を使用することを強くお勧めします。
Lucene と Distributed Lucene の動作と動作は、いくつかの変更点を除いてほぼ同じです。 Distributed Lucene のワークフロー、データ分散、およびコンポーネントについては、次のセクションで説明します。
分散 Lucene ワークフロー
以下の図は、分散 Lucene モデルがどのように機能するかを示しています。
クライアント アプリケーションは、Lucene API を使用して、ドキュメントのインデックス付けと分析 (サポートされている Lucene アナライザーによる分析)、または既存のインデックス付きドキュメントのクエリを実行する必要がある場合があります。 API を使用したこれらの操作はリモート プロシージャ コール (RPC) のように動作し、直接に転送されます。 NCache 集まる。 クラスターはこれらの呼び出しの性質を判断し、各サーバー ノードに接続されている Distributed Lucene モジュールに呼び出しを転送します。 これらのモジュールはこれらの呼び出しを実行し、呼び出しの性質に応じて次のいずれかのアクションが実行されます。
クエリドキュメント呼び出し: クエリ呼び出しの場合、Distributed Lucene モジュールは結果をクライアント側に返し、そこでこれらの結果はすべてマージされて処理されます。
インデックスドキュメント呼び出し: ドキュメントのインデックスを作成する呼び出しの場合、分散 Lucene モジュールはそのドキュメントをディスク ドライブに保存します。
データ配信
キャッシュ クラスターに対して分散マップが生成されます。 分散 Lucene の場合、次のマップが生成されます。
- キャッシュの作成について。
- サーバーノードの追加または削除について。
警告
配布マップが存在しない場合、キャッシュの開始に失敗し、イベント ビューアとサービス ログに例外が記録されます。
このマップには、キャッシュ ノードに対するバケットに関する情報が含まれています。 分散 Lucene キャッシュのバケットの総数は 100 です。これらの 100 個のバケットは、特定の戦略を使用してクラスター内に分散されます。
100 個のバケットがあるということは、インデックスがキャッシュ クラスター全体で 100 個のサブインデックスに分割されることを意味します。 各ノードに割り当てられたバケットの数に基づいて、それぞれのインデックス ファイルもすべてその特定のノードに移動されます。 したがって、状態転送によってキャッシュ クラスター全体でバケットが移動されるたびに、対応するインデックス ファイルもプロセスの一部として移動されます。
サーバー ノードには複数のインデックスを含めることができ、そのサーバー ノード内の各インデックスには、クラスターの分散戦略に従って割り当てられたバケットが含まれます。 インデックスに対するドキュメントは、これらのバケットを介して均等に分散されます。 これらのインデックスは物理ドライブにも保存されます。
NCache ランタイムまたは動的配布を備えています。 ノードの開始または停止により、キャッシュ クラスターの分散マップの変更がトリガーされ、状態転送がトリガーされます。 ただし、 NCache 分散 Lucene では、ノードの起動時または停止時にインデックスが不必要に分散されるのを避けるために、インデックスは物理ドライブに永続化されます。 つまり、 NCache 分散 Lucene では、キャッシュ クラスターへのノードの追加または削除のみが分散マップを変更し、実行中のサーバー ノードの状態転送をトリガーします。 停止したサーバー ノードの場合は、オンラインに戻ると状態の転送が行われます。
以下に考慮すべき重要な点をいくつか示します。 NCache 分散 Lucene:
- キャッシュの分布マップ: 新しいキャッシュの分布マップは、キャッシュの作成が成功した場合にのみ生成されます。 何らかの理由で分布マップの生成が失敗した場合、キャッシュの作成はロールバック (元に戻り) します。
- 状態転送: キャッシュ クラスター メンバーシップの構成を変更すると、キャッシュ クラスター内の状態転送がトリガーされるため、分布マップも変更されます。
- 既存のクラスターへのノードの追加: この場合、すべてのサーバー ノード (追加されるノードも含む) が物理的に利用可能であり、そのサービスが実行されている必要があります。 ノードが分散 Lucene キャッシュ クラスターに追加されると、既存の分散マップが既存のサーバー ノードからフェッチされます。 その後、新しい分散マップが生成され、すべてのサーバー ノードで共有されます。 この分布マップを永続化するためにコミット呼び出しが送信されます。
- 既存のクラスターからのノードの削除: この場合、既存のクラスターへのノードの追加と同様に、すべてのサーバー ノード (削除されるノードを除く) が物理的に利用可能であり、それらのサービスが実行されている必要があります。 そうしないと、この操作は失敗します。
- 状態転送中のノードのシャットダウン: 状態転送中にサーバー ノードがシャットダウンした場合、そのノードの状態転送は停止され、ノードが再起動したときに同じバケット (ノードがシャットダウンした場所) から再開されます。
重要
開発者インストールの場合、ストアは Distributed Lucene を構成できます。
分散Luceneを初期化する
Distributed Lucene を使用してドキュメントのインデックスを作成し、後でドキュメントを検索する前に、次のことを行う必要があります。 初期化します それを最初に。 初期化したら、キャッシュ名とインデックス名を指定する必要があります。
インデックスデータ
Distributed Lucene のインデックス作成プロセスは、Lucene 自体と同じです。 分散 Lucene の場合、 NCache ドキュメントを配布するためのキーと値のストアを維持し、自動生成されたキーが各ドキュメントに追加されます。 ドキュメントは、その特定のキーに対してノード上でインデックス付けされます。
インデックス検索
Distributed Lucene が初期化され、ドキュメントのインデックスが作成されると、これらのドキュメントに対してテキストベースの検索を実行できるようになります。
ファセット
カテゴリは、インデックス付きドキュメントを分類するために使用される、ドキュメントの重要な側面です。 たとえば、電子商取引ストアで衣服を検索する場合、衣服のカテゴリは価格、素材、ブランドなどになります。
ファセット検索では、通常の検索結果に加えて、特定のカテゴリのサブカテゴリで構成されるファセット結果も取得されます。 上記の例を続けると、素材ファセットのサブカテゴリには、綿、ウール、革などが含まれます。
ファセット検索を使用すると、必要な特定のドキュメントを非常に簡単に検索できます。 NCache Distributed Lucene を使用したファセットがサポートされるようになりました。これにより、目的のドキュメントを効率的かつ効果的に作成できるようになります。 Lucene と Distributed Lucene のファセットの動作はほとんど同じですが、パフォーマンスが大幅に強化されています。 分散Luceneファセット.
地理空間API
経度と緯度の座標値を含むデータを 地理空間データ。 このデータは、位置に基づいてデータを検索する場合に役立ちます。 たとえば、レストランの情報が含まれるドキュメントにインデックスを付けたいとします。 このドキュメントにはさまざまなフィールドが含まれており、それらのフィールドの XNUMX つに経度と緯度の値が含まれています。 今後、このドキュメントを場所 (たとえば、最寄りのレストラン) に基づいて検索するには、経度と緯度のフィールドにもインデックスを付ける必要があります。
Lucene には非常に強力な地理空間データのインデックス作成および検索機能があり、現在では NCache また、Lucene API を使用して、ドキュメントのインデックスを作成し、その場所に基づいてドキュメントを検索することもできます。 次のリンクは、データにインデックスを付けて検索する方法を理解するのに役立ちます 分散LuceneGeo-SpatialAPI のセクションから無料でダウンロードできます。
部分クラスターにおける分散 Lucene の動作
キャッシュ クラスター内の XNUMX つ以上のノードが使用できなくなると、キャッシュ クラスターは部分的であると宣言されます。 したがって、接続が制限され、キャッシュ クラスターが部分クラスターになります。 部分クラスターでの Distributed Lucene の動作を以下に説明します。
部分的なクラスターでの読み取り操作
NCache 分散 Lucene を使用すると、 AllowPartialResults
プロパティへ TRUE
IndexReader
クラスインスタンス。 デフォルトでは、 AllowPartialResults
フラグが設定されています FALSE
.
これらの読み取り操作では、部分的または不完全なデータが返されます。 ただし、次の場合は、 パーティション-レプリカトポロジを使用すると、キャッシュ クラスターはそのレプリカを通じて単一ノードの障害を許容し、完全なデータを取得できるようになります。 ただし、複数のノードに障害が発生した場合は、部分的なデータしか取得できません。
警告
部分クラスターからデータを読み取ろうとしたときに、 AllowPartialResults
フラグを立てる FALSE
、例外がスローされます。
部分的なクラスターでの書き込み操作
分散 Lucene では、部分クラスターに対して追加、更新、削除などの書き込み操作を実行することはできません。 部分的なクラスターに対してこれらの操作を実行しようとすると、例外がスローされます。
サポートされていないLuceneAPI
以下に、Distributed Lucene でサポートされていない Lucene API のリストを示します。
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
その他のリソース
NCache 分散Luceneのサンプルアプリケーションを提供します GitHubの.
も参照してください
Luceneコンポーネントと概要
Luceneクエリインデックスを設定する
キャッシュ内のSQL検索
LINQでキャッシュを検索