データが「新しい通貨」として造語されるにつれて、Apache Lucene は、大量のテキスト データに対する柔軟なテキスト検索を組み込むためにアプリケーションで広く使用されている、人気のある全文検索エンジンとして注目を集めています。 ルセンが使う 逆索引付け、特定の用語に関連するドキュメントを検索する時間を大幅に削減します。
NCache 詳細 分散Lucene NCache ドキュメント
ただし、これはスタンドアロン ソリューションであり、データの増加に合わせて拡張することはできません。データを検索するには、Lucene インデックス全体を再構築する必要があります。これは、コストが高く遅いタスクであり、パフォーマンスのボトルネックになります。 現在、スケーラブルな全文検索に対応する Java および REST ベースのソリューションはいくつか存在しますが、.NET スタックに自然に適合するスケーラブルな全文検索ソリューションはまだ不足しています。
分散Luceneを使用する NCache .NETの場合
NCacheは、強力で人気のある .NET インメモリ データストアであり、その分散アーキテクチャ上にネイティブの Lucene.NET API を実装しています。これは標準の Lucene.NET API であるため、コードを変更する必要なく、スケーラブルな方法で使用できます。 NCache.
NCache また、この Lucene.NET を利用して動的にスケーラブルな環境でインデックスを作成し、 分散型全文検索. これらの検索の結果は、アプリケーションに送り返される前にマージされます。
NCache 詳細 分散 Lucene の仕組み Luceneコンポーネントと概要
これにより、スタンドアロンのLuceneが拡張され、高速で線形にスケーラブルな全文検索ソリューションになります。
NCache 詳細 エンタープライズ検索用の分散Lucene 分散Lucene
.NETアプリでのLuceneの使用
何千もの製品、注文、および顧客の詳細に関する情報を保持する E コマース サイトを考えてみましょう。 したがって、すべての属性、特に非テキスト フィールド (検索中に使用されない) のインデックスを作成することは、キャッシュ メモリを使い果たすため、賢明な方法ではありません。
たとえば、製品のドキュメントは次のようになります。
1 2 3 4 5 6 7 8 9 |
{ “ID”: “ABC34”, “Name”: “Tupperware”, “Description”: “Microwaveable, dishwasher-friendly, reusable Tupperware in three sizes”, “RetailPrice”: 15.00, “Discount”: 3.00 } |
これで、クライアントがドキュメントの XNUMX つのフィールドである製品説明に対して全文検索を実行することがわかりました。 では、検索可能なフィールドのみにインデックスを付け、データベースやファイル システムなどの永続ストア内の対応するドキュメントを参照するキーを持つとしたらどうでしょうか。 このように、特定のタイプの製品 (「食洗機対応タッパーウェア」など) をクエリすると、これらの用語に一致する説明を持つすべての製品が、製品 ID をドキュメント キーとして表示され、ドキュメント全体を取得できます。永続化されたインデックス。
既存のアプリケーションで分散 Lucene を使用するには、指定するだけです。 NCacheディレクトリを開くときのディレクトリ。 これには、 NCache キャッシュ名とインデックス名。 次のコード スニペットは、LuceneCache のキャッシュ上のディレクトリを開きます。 NCache ProductIndexという名前のインデックス。
1 2 3 4 5 6 7 |
// Specify the cache name and index path for Lucene string cache = "LuceneCache"; string index = "ProductIndex"; // Create directory and open it on the cache Directory directory = NCacheDirectory.Open(cache, index); |
Luceneには、特定の文字列をLuceneクエリに解釈する広範なクエリ言語が付属しています。 これは、用語、複数の用語、ワイルドカード、またはあいまいな単語のいずれかで実行できます。 Luceneクエリの詳細については、以下をお読みください。 Luceneクエリドキュメント.
次のコード スニペットは、ディレクトリに IndexReader を作成します。これは、IndexSearcher によって使用されます。 データは、StandardAnalyzer に基づいて分析およびトークン化されます。 結果の最初の 50 件のヒットがアプリケーションに返されます。 アナライザーは、インデックスの作成時に使用したものと同じでなければならないことに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// The 'applyAllDeletes' is true so all enqueued deletes are applied on writer IndexReader reader = DirectoryReader.Open(indexWriter, true); // A searcher is opened to perform searching IndexSearcher indexSearcher = new IndexSearcher(reader); // Specify the searchTerm, fieldName and analyzer string searchTerm = "Beverages"; string fieldName = "Category"; // Note that the analyzer should be same as the one used during index creation Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); // Create a query parser to parse the query QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, fieldName, analyzer); Query query = parser.Parse(searchTerm); // Returns the top 50 hits from the result set ScoreDoc[] docsFound = indexSearcher.Search(query, 50).ScoreDocs; reader.Dispose(); |
分散インデックスを構築するためのデータのロード
Luceneを使用すると、必要に応じてインデックスを作成し、それらにデータをロードできます。 インデックスには、必要に応じてデータを分析してトークン化するアナライザーが必要です。空白、文字以外、句読点などがあります。 Luceneインデックスのライターを作成したら、ドキュメントを作成してフィールドを追加できます。 次に、このドキュメントのインデックスが作成されます NCache Commit()を呼び出すと、分散インデックスとして。 Luceneアナライザーの詳細については、以下を参照してください。 Luceneアナライザードキュメント.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Specify the cache name and index path for Lucene string cache = "LuceneCache"; string indexPath = "ProductIndex"; // Create directory and open it on the cache Directory directory = NCacheDirectory.Open(cache, indexPath); // The same analyzer is used as for the reader Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer); // Create indexWriter on NCache directory IndexWriter indexWriter = new IndexWriter(directory, config); Product[] products = FetchProductsToIndex(); foreach (var product in products) { Document doc = new Document { new StoredField("id", product.ID), new TextField("name", product.Name, Field.Store.YES), new TextField("description", product.Description, Field.Store.YES), new StringField("category", product.Category, Field.Store.No), new StoredField("retail_price", product.RetailPrice), }; indexWriter.AddDocument(doc); } indexWriter.Commit(); </code><br /><br /><a href="/ncache/">NCache Details</a> <a href="/resources/docs/ncache/prog-guide/lucene-ncache.html#working-of-distributed-lucene">Working of Distributed Lucene</a> <a href="/blogs/geospatial-indexes-for-distributed-lucene-with-ncache/">GeoSpatial Indexes for Distributed Lucene</a> |
なぜ NCache 分散Luceneの場合?
使い方 NCache for distributed Lucene には、次の利点があります。
- 非常に高速で直線的にスケーラブル: NCache はインメモリ分散データ ストアであるため、ビルド 分散ルセン その上で、全文検索に同じ最適なパフォーマンスを提供します。 さらに、 NCacheの分散アーキテクチャであるLuceneインデックスは、クラスターのすべてのサーバーに分割されています。 これにより、データの負荷が増加するにつれて外出先でサーバーを追加できるため、スケーラブルになり、Luceneインデックスは自動的に作成されます redisクライアントの介入なしに賛辞。
- 信頼性と高可用性のためのデータレプリケーション: NCacheの Partition-of-Replica トポロジでは、Lucene インデックスがすべてのサーバー間でパーティション化されるだけでなく、各パーティションもクラスターの別のサーバーに複製されます。 したがって、いずれかのサーバーがダウンした場合、パーティションのレプリカが t/resources/docs/ のすべてのクエリを処理します。ncache/admin-guide/distributed-lucene-counters.htmlインデックスを作成して、信頼性を確保します。 同様に、サーバー ノードがダウンした場合、 NCache 動的に自己回復します 残りのノード内のデータを再調整することにより、ダウンタイムや Lucene インデックスへの影響なしで、高可用性を確保します。
まとめ
要約すると、強力な検索エンジン Lucene のおかげで、全文検索は今やほぼすべてのビジネスで基本的なものになっています。 しかし、データが大きくなるにつれて、インデックスを再構築すると、利益よりも損害の方が大きくなる可能性があります。 NCache 必要なのは、既存の Lucene アプリケーションのコードを XNUMX 行変更するだけです。ほら、メモリ内の分散型全文検索メカニズムとして、両方の長所を活用できます。