# Scroll APIでpost filterを利用すると上手く結果が取得できない

**URL:** https://discuss.elastic.co/t/scroll-api-post-filter/116654
**Category:** 日本語による質問・議論はこちら
**Created:** [January 23, 2018, 11:16am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654 "2018-01-23T11:16:50Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Nao\_Mk2](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nao_mk2/32/26832_2.png) [@Nao\_Mk2](https://discuss.elastic.co/u/Nao_Mk2)
#### Post date: [January 23, 2018, 11:16am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/1 "2018-01-23T11:16:50Z")

</div>

こんにちは。

**Elasticsearchのバージョン : 6.1.1**

数万件のドキュメントがあるインデックスからScroll APIを利用して1,2万件程度のドキュメントを取得しようとしているのですが、絞り込みに以下のようなpost\_filterを利用しています。

```json
POST test_index/_search?scroll=1m
{
  "size": 2000,
  "post_filter": {
    "bool": {
      "must": [
        {
          "term": {
            "keyword_field": {
              "value": "hoge"
            }
          }
        }
      ]
    }
  }
}

```

上述のリクエストをした場合は正常に結果が取得できるのですが、その続きを取得しようとした場合に想定通りに取得できません。

```json
POST /_search/scroll/
{
  "scroll" : "1m", 
  "scroll_id": "{_scroll_idの値を設定}"
}

```

想定では続きの2000件(sizeに指定した件数)が取得できると考えているのですが、hitsに返って来る件数が数件になっています。  
そのまま続けてリクエストすると数件(リクエスト毎に異なる)だけ返って来て、hitsが空になった段階で取得できたドキュメントの総数は想定を下回っています。

Elasticsearchが5.6系の頃は上手くいっていたので絞り込み条件自体が誤っているということでは無いかなと思っております。

何かお分かりになることがあれば教えていただければ幸いです。

---

<div class="post-metadata">

### Author: ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)
#### Post date: [January 23, 2018, 2:05pm UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/2 "2018-01-23T14:05:19Z")

</div>

post\_filterの代わりにqueryを利用した場合にはどうなるでしょうか？  
また、queryを利用した場合に取得できるヒット件数は想定している約12000件であっていますでしょうか？

ちなみに、post\_filterを利用している意図は何かありますでしょうか？

---

<div class="post-metadata">

### Author: ![Nao\_Mk2](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nao_mk2/32/26832_2.png) [@Nao\_Mk2](https://discuss.elastic.co/u/Nao_Mk2)
#### Post date: [January 23, 2018, 2:57pm UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/3 "2018-01-23T14:57:12Z")

</div>

queryのfilterに置きかえれば正しく動作することは確認いたしました。  
その場合は取得件数も想定通りです。

ですので置きかえれば問題ないのですが、6系へバージョンアップするにあたり  
post\_filterの挙動が変わるような記述を上手く見つけることが出来なかったため  
こちらでお伺いさせていただいた次第です。

post\_filterを使っているのは将来的にaggregationした結果から絞り込んで取得するかもしれないからという理由です。

---

<div class="post-metadata">

### Author: ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)
#### Post date: [January 24, 2018, 3:22am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/4 "2018-01-24T03:22:54Z")

</div>

なるほど。scrollはコストがかかるので、クライアントが多いなどの場合はちょっと懸念があるかと思ったので質問しました。

再現できるようなサンプルとかはお持ちでしょうか？  
バグかもしれないので、再現できればIssueに登録していただけると助かります。

---

<div class="post-metadata">

### Author: ![Nao\_Mk2](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nao_mk2/32/26832_2.png) [@Nao\_Mk2](https://discuss.elastic.co/u/Nao_Mk2)
#### Post date: [January 26, 2018, 9:51am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/5 "2018-01-26T09:51:23Z")

</div>

色々試してみて、以下のデータで再現できる事がわかりました。

**Template**

```auto
PUT _template/scroll_test_template
{
  "index_patterns": "scroll-test",
  "mappings": {
    "doc": {
      "properties": {
        "keyword_field": {
          "type": "keyword"
        }
      }
    }
  }
}

```

**Document**

```auto
POST scroll-test/doc/_bulk
{ "index": {} }
{ "keyword_field" : "value00000" }
{ "index": {} }
{ "keyword_field" : "value00001" }
{ "index": {} }
{ "keyword_field" : "value00002" }
   .
   .
   .
{ "index": {} }
{ "keyword_field" : "value49997" }
{ "index": {} }
{ "keyword_field" : "value49998" }
{ "index": {} }
{ "keyword_field" : "value49999" }

```

**Query**

```json
GET scroll-test/_search?scroll=1m
{
  "size": 50,
  "post_filter": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "keyword_field": "value*010*"
          }
        }
      ]
    }
  }
}

GET /_search/scroll/
{
  "scroll" : "1m",
  "scroll_id": "{_scroll_id}"
}

```

hitsのtotalは199となっているのですが、Scrollを呼び続けてhitsが空になった段階では合計で111件しか取得できませんでした。

scroll\_id指定での呼び出し時にsizeの分だけ元のドキュメントを取得した上でpost\_filterが適用され、その結果hitsが空になるとそこでScrollが終了しているような気がします。

とりあえずこちらの内容でIssueに登録してみようと思います。  
ありがとうございました。

---

<div class="post-metadata">

### Author: ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)
#### Post date: [January 27, 2018, 10:21am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/6 "2018-01-27T10:21:02Z")

</div>

確認ありがとうございます。  
Issue登録で困ったことなどあれば連絡いただければと思います！

---

<div class="post-metadata">

### Author: ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)
#### Post date: [February 1, 2018, 4:01pm UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/7 "2018-02-01T16:01:02Z")

</div>

Issue登録ありがとうございます。  
リンクを貼っておきます。

> <https://github.com/elastic/elasticsearch/issues/28411>

すでにElasticsearchチームのものがPRを作成中です。

---

<div class="post-metadata">

### Author: ![Nao\_Mk2](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nao_mk2/32/26832_2.png) [@Nao\_Mk2](https://discuss.elastic.co/u/Nao_Mk2)
#### Post date: [February 2, 2018, 1:15am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/8 "2018-02-02T01:15:11Z")

</div>

こちらこそご確認いただき、ありがとうございました。  
修正も早くて非常に助かります！

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [March 2, 2018, 1:15am UTC](https://discuss.elastic.co/t/scroll-api-post-filter/116654/9 "2018-03-02T01:15:19Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
