ホームページ  >  記事  >  バックエンド開発  >  C# で ES を使用する方法

C# で ES を使用する方法

高洛峰
高洛峰オリジナル
2017-02-08 13:32:012119ブラウズ

Elasticsearch の紹介

Elasticsearch (ES) は、Lucene をベースにしたオープンソースの検索エンジンであり、安定性、信頼性、高速性を備えているだけでなく、分散環境向けに特別に設計されています。

Elasticsearch とは何ですか?

Elasticsearch は、Apache Lucene(TM) に基づくオープン ソースの検索エンジンであり、オープン ソースの分野でも独自の分野でも、Lucene は最も先進的で、最もパフォーマンスが高く、最も包括的な検索エンジンであると考えられます。日付の図書館。
ただし、Lucene は単なるライブラリです。その能力を活用するには、C# を使用してそれをアプリケーションに統合する必要があります。 Lucene は非常に複雑なので、その仕組みを理解するには検索についての深い理解が必要です。
Elasticsearch も Java で書かれており、Lucene を使用してインデックスを構築し、検索機能を実装しますが、その目的は、全文検索をシンプルにし、シンプルで一貫した RESTful API を通じて Lucene の複雑さを隠すことです。
ただし、Elasticsearch は単なる Lucene と全文検索エンジンではなく、次の機能も提供します:

すべてのフィールドにインデックスが付けられ、検索可能な分散型リアルタイム ファイル ストレージ

リアルタイム分析を備えた分散型検索エンジン

拡張された数百台のサーバーで、ペタバイト規模の構造化データまたは非構造化データを処理します

さらに、これらすべての機能が 1 つのサーバーに統合されており、アプリケーションは、シンプルな RESTful API、さまざまな言語のクライアント、さらには対話のコマンドラインを通じてサーバーと対話できます。 。 Elasticsearch を始めるのは簡単で、多くの適切なデフォルトが用意されており、初心者には複雑な検索エンジン理論が隠されています。すぐに使用できる (インストールされてすぐに使用できる) ため、運用環境で使用するために最小限の学習が必要です。 Elasticsearch は Apache 2 ライセンスに基づいてライセンスされており、無料でダウンロード、使用、変更できます。
知識の蓄積により、さまざまな問題領域に応じて Elasticsearch の高度な機能をカスタマイズでき、構成は非常に柔軟です。

C# を使用して ES を操作します

NEST は、すべてのリクエストとレスポンスのオブジェクトをマッピングでき、厳密に型指定されたクエリ DSL (ドメイン固有言語) を持ち、共分散や自動マッピングなどの .net 機能を使用できる高レベルのクライアントです。 POCO、NEST は引き続き内部で Elasticsearch.Net クライアントを使用します。 elasticsearch.net (NEST) クライアントは、ユーザーの便宜のために厳密に型指定されたクエリ DSL を提供します。ソース コードはダウンロードできます。

1. NESTのインストール方法

NuGetパッケージマネージャーコンソールからVSのツールメニューを開き、次のコマンドを入力してNESTをインストールします

Install-Package NEST

インストール後、次の3つのDLLが参照されます

Elasticsearch.Net .dll (2.4.4) Nest.dll (2.4.4) Newtonsoft.Json.dll (バージョン 9.0)

2. elasticsearch へのリンク

接続プールを使用して Elasticsearch クラスターに接続できます単一ノードを介して接続するか、複数のノードを指定する場合、接続プールを使用すると、ロード バランシングやフェイルオーバーなどのサポートなど、単一ノードを Elasticsearch に接続するよりも多くの利点があります。

シングルポイントリンク経由:

var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);

via connectionプールリンク:

var ノード = new Uri[]

{

new Uri("http://myserver1:9200"),

new Uri("http://myserver2:9200"),

new Uri("http://myserver3:9200")

};


var pool = new StaticConnectionPool(nodes);

var settings = new ConnectionSettings(pool);

var client = new ElasticClient(settings) );

NEST インデックス

リクエストがどのインデックスで操作する必要があるかを知るために、Elasticsearch API はリクエストの一部として 1 つ以上のインデックス名を受け取ることを期待します。

1. インデックスを指定します

1。ConnectionSettings を通じて .DefaultIndex() を使用して、デフォルトのインデックスを指定できます。リクエストで特定のインデックスが指定されていない場合、NEST はデフォルトのインデックスをリクエストします。

var settings = new ConnectionSettings()
.DefaultIndex("defaultindex");

2. ConnectionSettings を通じて .MapDefaultTypeIndices() を使用して、CLR 型にマップされるインデックスを指定できます。

var settings = new ConnectionSettings()
.MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects")
);

注: .MapDefaultTypeIndices() で指定されたインデックスの優先順位は.DefaultIndex() でインデックスを指定するよりも優れており、単純なオブジェクト (POCO) に適しています

3. さらに、リクエストのインデックス名を明示的に指定することもできます。例:

var response = client.Index(student, s=>s.Index("db_test"));
var result = client.Search s.Index("db_test"));
var result = client.Delete(null, s => s.Index("db_test"));

注: 実際のリクエストにインデックス名を指定する場合、この優先順位は最も高く、上記の 2 つの方法で指定したインデックスよりも高くなります。

4. 一部の Elasticsearch API (クエリなど) は、1 つまたは複数のインデックス名を使用するか、_all 特殊フラグを使用して NEST 上の複数またはすべてのノードにリクエストを送信できます

//単一のノードをリクエストします

var singleString = Nest 。 Indexes.index ("db_studnet"); & lt;student & gt ().Index (SingleString);


;複数のノード

var manyStrings = Nest.Indices.Index("db_studnet", "db_other_student");

var manyTypes = Nest.Indices.Index().And();


ISearchRequest manyStringRequest = new SearchDescriptor().Index(manyStrings);

ISearchRequest manyTypedRequest = new SearchDescriptor ().Index(manyTypes);


//すべてのノードをリクエストします

var indicesAll = nest.indices.all;

varallindices = nest.indices.allindices; .Index(allIndices);


2. インデックスを作成します

Elasticsearch API を使用すると、インデックスの作成とインデックスの作成を同時に行うことができます。次に例を示します。

var descriptor = new CreateIndexDescriptor("db_student") )

.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1));

client.CreateIndex(descriptor);

これは、インデックスのシャードの数が 5 であり、レプリカは1です。

3. インデックスの削除


Elasticsearch API を使用すると、次のようにインデックスを削除できます。ここで定式化します。 削除するインデックス名「db_student」を指定します。その他の削除の使用例は次のとおりです。

//指定されたインデックスが存在するノード配下のすべてのインデックスを削除します

var descriptor = new DeleteIndexDescriptor("db_student").AllIndices ();

NEST マッピング


NEST では、属性を使用したカスタム マッピング方法を紹介します。

1. 簡単な実装

1. ビジネスに必要な POCO を定義し、必要な属性を指定します

[ElasticsearchType(Name = "student")]

public class Student

{


[Nest.String(Index) = FieldIndexOption.NotAnalyzed)]

パブリック文字列 ID { セット; }

[Nest.String(Analyzer = "standard")]

パブリック文字列名 { セット; [ Nest.String(Analyzer = "standard")]

public string description { get; }

public DateTime DateTime { get; ) マッピングを実装するには

var descriptor = new CreateIndexDescriptor("db_student")

.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1))

.Mappings(ms => ms

. Map< ;Student>(m => m.AutoMap())

);


client.CreateIndex(descriptor);

注: Attribute によって定義されたマッピングは、.Properties() を通じてオーバーライドできます

II、属性の紹介

1、StringAttribute

3、BooleanAttribute

4、

5、オブジェクトのトリビュート

NEST Search

NEST は、Lambda チェーン クエリ DLS (ドメイン固有言語) のサポートを提供します。以下に、簡単な実装と各クエリの簡単な説明を示します。

1. シンプルな実装

1. プロジェクトでの複雑なビジネスの実装を容易にするために SearchDescriptor を定義します

var query = new Nest.SearchDescriptor();
var result = client.Search( x = > query)

2. タイトルと内容にキーが含まれ、作成者が「Qiao Jiaren」と等しくない文書を取得します

q.Bool(b => ;

b.must(m =&gt; b。.query(key))

( "wenli")

); Elasticsearch はデフォルトの単語セグメンテーションを使用します。タイトルとコンテンツの属性は [Nest.String(Analyzer = "standard")] です

Elasticsearch が IK 単語セグメンテーションを使用する場合、タイトルとコンテンツの属性は [Nest.String(Analyzer = "ikmaxword] です) ")] または [Nest.String(Analyzer = "ik_smart")]

作成者の属性は [Nest.String (Index = FieldIndexOption.NotAnalyzed)] で、アナライザーの使用を禁止します

3. 著者が次のようなドキュメントをフィルターします「歴史的な川」に等しい

query.PostFilter(x => x.Term(t => t.Field(obj = > obj.Author).Value("wenli")));

4 . 著者が「Historical River」または「Friendship Boat」と等しいドキュメントをフィルターし、スペースで区切られた複数の著者と一致します

query .PostFilter(x => x.QueryString(t => t.Fields(f) => 5. 1 から 100 までの数値でドキュメントをフィルターします

query.PostFilter(x => 100)));

6. スコア順に並べ替える

query.Sort(x => x .Field("_score", Nest.SortOrder.Descending));

7. 定義 スタイルとフィールドを強調表示します


query.Highlight(h => h


.PreTags("") )

.PostTags("")

.Fields(
o )

)

);

8. クエリコンテンツを組み立て、データを整理し、フロントエンド呼び出しを容易にする


var list = result.Hits.Select(c => new Models.ESObject()

{

Id = c.Source.Id,

Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights[ "title"].Highlights): c.Source.Title, // ハイライトされたコンテンツはレコード内に複数回表示されます

Content = c.Highlights == null ? c.Source.Content: c.Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c. Source.Content, //強調表示されたコンテンツは 1 つのレコード内に複数回表示されます

Author = c.Source.Author,

Number = c.Source.Number,

IsDisplay = c.Source.IsDisplay,

Tags = c .Source.Tags,

Comments = c.Source.Comments,

DateTime = c.Source.DateTime,


})

2. クエリ DSL の概要

並べ替えるには...

elasticsearch.net ドキュメント

ドキュメント操作には、ドキュメントの追加/更新、ドキュメントの部分更新、ドキュメントおよび対応するバッチ操作ドキュメント メソッドの削除が含まれます。

1. ドキュメントの追加/更新とバッチ操作

単一のドキュメントの追加/更新

Client.Index(student);

ドキュメントの一括追加/更新

var list = new List();2 3 client.IndexMany(list);

2. 単一ドキュメントの部分更新とバッチ操作

単一ドキュメントの部分更新

クライアント。 Update("002", upt => upt.Doc(new { Name = "wenli" }));

バッチドキュメントを部分的に更新

var ids = new List( ) { "002 " };


varBulkQuest = new BulkRequest() { Operations = new List() };


foreach (var v in ids)

{

var 操作= new BulkUpdateOperation< Student, object>(v);


Operation.Doc = new { Name = "wenli" };


BulkQuest.Operations.Add(operation);

}


var result = client.Bulk(bulkQuest);


3. ドキュメントの削除とバッチ操作

単一のドキュメントを削除します

client.Delete("001");

次のドキュメントを削除しますバッチ

var ids = new List() { "001", "002" };


varBulkQuest = new BulkRequest() { Operations = new List() };


foreach (var v in ids)

{

BulkQuest.Operations.Add(new BulkDeleteOperation(v));

}


var result = client.Bulk(bulkQuest);

もっと見る C# ESの使い方 関連記事はPHP中国語サイトに注目!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。