読者です 読者をやめる 読者になる 読者になる

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)。

テストコードも参照すると捗ると思います。

elasticsearch-net/UpdateTests.cs at 682bc5293379b1c94b2e94d832fe3c7c5022e9b5 · elasticsearch/elasticsearch-net · GitHub

ドキュメントの削除

特定の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の操作など他にも文章に残しておきたいものがありますが、それはまた次回以降に。