Elasticsearch + NESTによるインデックスの操作とCRUD基本
Elasticsearchを.NETで扱うライブラリNESTの基本的な操作についてです。
ドキュメントがあるにはあるのですが、情報が古いため現在では使用することのできない記述なども多いです。そのためテストコードを見るのが確実だと思います。ここではNEST ver.1.1.1のインデックスの操作と、簡単なCRUDについてメモ代わりに記載します。
Index
インデックスの作成
CreateIndex
を使います。
例:
var client = new ElasticClient(settings); // 以降の例では宣言を省略 client.CreateIndex("インデックス名", s => s .AddMapping<ElasticsearchProject>(m => m .MapFromAttributes() .Properties(pp=>pp .String(pps=>pps.Name(p=>p.Country).Index(FieldIndexOption.Analyzed)))));
インデックスの削除
DeleteIndex
を使います。
例:
client.DeleteIndex(new DeleteIndexRequest(new IndexNameMarker { Name = "インデックス名" }));
Document
ドキュメントの新規作成
Index
を使います。
例:
var person = new Person(){ Id = 1, FirstName = "Chuck", LastName = "Norris" }; client.Index<Person>(person);
ドキュメントのクエリ
色々な方法がありますが、簡単なTermクエリは以下
例:Idが1のPersonタイプのドキュメントをTermクエリする
client.Search<Person>(s => s.Query(q => q.Term(f => f.Id, 1)));
ドキュメントの更新
例:更新用のクラスを用意する場合
public class PersonUpdate { public string FirstName { get; set; } } client.Update<Person>(p => p.Id(1).Doc(new PersonUpdate { FirstName = "Bud" });
dynamic
を用い、更新用のクラスを使わずに更新する方法もあります。
例:dynamicを用いた更新
dynamic personUpdate = new System.Dynamic.ExpandoObject(); personUpdate.FirstName = "Bud"; client.Update<Person, object>(p => p.Id(1).Doc((object)personUpdate));
dynamicを用いた更新の場合、現状だとdynamicをobject型にキャストしないとうまく動かないことに注意してください(該当issue)。
テストコードも参照すると捗ると思います。
ドキュメントの削除
特定のIdのドキュメントを削除する場合、Delete
を使います。
例:Idが1のPersonタイプのドキュメントを削除する
client.Delete(new DeleteRequest<Person>(1));
クエリによって一致したドキュメントを全て削除する場合は、DeleteByQuery
を使います。
例:Termクエリを用い、PesronタイプのFirstNameが"Chuck"のドキュメントを全て削除する
client.DeleteByQuery<Person>(s => s.Query(q => q.Term(f=> f.Firstname, "Chuck")));
終わりに
とりあえず基本的な操作はこんな感じです。インデックスの詳細な設定や、Nested Typeの操作、Attachment Typeの操作など他にも文章に残しておきたいものがありますが、それはまた次回以降に。