【備忘録】ElasticsearchでScroll処理を実施する(.NET Core)

データベース データベース

この記事の内容

この記事では、ElasticsearchのScrollを使用して、検索結果を取得する方法を紹介します。

言語はC# .NET Coreで記載しています。

ソースコード

Nugetで、Elasticsearch.Netおよび、Newtonsoft.Jsonを取得する必要があります。

using System;
using Elasticsearch.Net;
using Newtonsoft.Json.Linq;

namespace ElasticsearchTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //スクロールの保持時間設定
            ElasticLowLevelClient client = new Elasticsearch.Net.ElasticLowLevelClient();
            SearchRequestParameters param = new SearchRequestParameters();
            param.Scroll = TimeSpan.FromMinutes(10);

            //検索
            var response = client.Search("index名を入力", PostData.String("{ \"size\" : 10 }"), param);

            //検索結果からスクロールIDと、検索結果を取得
            string scrollID = String.Empty;
            string hits = String.Empty;
            ParseData(response.Body, out scrollID, out hits);

            //スクロールしつつ、結果を取得
            while(true)
            {
                //スクロール処理
                bool isEmpty = false;
                response = client.Scroll(PostData.String("{ \"scroll\":\"1m\", \"scroll_id\":\"" + scrollID + "\"}"));
                ParseData(response.Body, out hits, out isEmpty);

                //結果がとれなくなったら終了
                if(isEmpty)
                {
                    break;
                }
            }

        }

        static void ParseData(string input, out string o_scrollID, out string o_hits)
        {
            o_scrollID = String.Empty;
            o_hits = String.Empty;

            JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject(input);

            string scrollID = obj["_scroll_id"].ToString();
            Console.WriteLine(scrollID);

            string hits = obj["hits"]["hits"].ToString();
            Console.WriteLine(hits);

            o_scrollID = scrollID;
            o_hits = hits;
        }

        static void ParseData(string input, out string o_hits, out bool o_isEmpty)
        {
            o_hits = String.Empty;
            o_isEmpty = false;

            JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject(input);
            if(!obj["hits"]["hits"].HasValues)
            {
                o_isEmpty = true;
                return;
            }

            string hits = obj["hits"]["hits"].ToString();
            
            Console.WriteLine(hits);

            o_hits = hits;
        }
    }
}

コメント