April 10, 2017

Elasticsearch'te Sayfalama Yapma (`start_after`) - 3

 Yazı hakkında bir yorum bırakmak için tıklayın.
 Bu yazıya sizde katkıda bulunabilirsiniz.

Scroll özelliği ile sorgularımızın sonuçlarını rahat bir şekilde sayfalama yapabiliyoruz. Ancak scroll özelliğinde sorgumuz context içerisinde tutulduğu için sayfalama sırasında sorgumuzu değiştiremiyoruz. Bu durum bizi gerçek zamanlı uygulamalarda sıkıntılı durumlara sokacaktır. Her seferinde sorgularınızı tekrar tekrar bir contexte eklemeniz gerekecektir.

“Search After” özelliği ile bu soruna da bir nebze çözüm bulabiliriz. Bu özellik ile canlı bir işaretçi oluşturabiliriz. İlk olarak örnek verimizdeki değerlere hızlıca bir bakalım:

Offset   | ID
262444821  | 10093220
262444572  | 10093219
262444331  | 10093218
262444090  | 10093216

Şimdi bu veriseti üzerinde bir sorgu ile sayfalama için nasıl bir yol izleyeceğimize bir göz atalım.

GET myindex/_search
{
  "from": 0,
  "size": 2,
  "sort": [
    {
      "offset": {
        "order": "desc"
      }
    }
  ],
  "_source": ["ID", "offset"]
}

Yukarıdaki bizim için ilk sorgumuz. 0’dan başlayıp 2 tane veri çekiyoruz. Şimdi bu örneğimizde tabiki basit gideceğiz. İlerleyen aşamada daha büyük sayılar ile tekrar örneklendirebiliriz. Farkettiysek sorgumuzda sıralama mevcut. Diğer örneklerde bir sıralama yoktu. “Search After” özelliği için bir sıralama yapmamız zorunludur. Çünkü sıralama yaptığımız alana göre bir sonraki sayfada çekeceğimiz veriyi seçeceğiz. Burada bize dönen veriye hızlıca bir göz atalım.

{
  "took": 26,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1029761,
    "max_score": null,
    "hits": [
      {
        "_index": "myindex",
        "_type": "mytype",
        "_id": "AVreenrAIMPgDpuvzEzN",
        "_score": null,
        "_source": {
          "offset": 262444821,
          "ID": "10093220"
        },
        "sort": [
          262444821
        ]
      },
      {
        "_index": "myindex",
        "_type": "mytype",
        "_id": "AVreenrAIMPgDpuvzEzM",
        "_score": null,
        "_source": {
          "offset": 262444572,
          "ID": "10093219"
        },
        "sort": [
          262444572
        ]
      }
    ]
  }
}

Şimdi Bir sonraki sayfayı çekelim:

GET myindex/_search
{
  "size": 2,
  "search_after": [262444572],
  "sort": [
    {
      "offset": {
        "order": "desc"
      }
    }
  ],
  "_source": ["ID", "offset"]
}

Bu sorgu sonucunda dönen ID değerlerinin 10093218 ve 10093216 olduğunu görebilirsiniz. Yukarıdaki tablomuzda da zaten sırasıyla bunların gelmesi gerektiğini biliyorduk. Dikkat ettiysek ikinci sorgumuzda "search_after": [262444572] parametresini kullanarak aslında sayfalamayı yapmış olduk.

{
  "took": 18,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1029761,
    "max_score": null,
    "hits": [
      {
        "_index": "myindex",
        "_type": "mytype",
        "_id": "AVreenrAIMPgDpuvzEzL",
        "_score": null,
        "_source": {
          "offset": 262444331,
          "ID": "10093218"
        },
        "sort": [
          262444331
        ]
      },
      {
        "_index": "myindex",
        "_type": "mytype",
        "_id": "AVreenrAIMPgDpuvzEzK",
        "_score": null,
        "_source": {
          "offset": 262444090,
          "ID": "10093216"
        },
        "sort": [
          262444090
        ]
      }
    ]
  }
}

Scroll özelliğinden farklı olarak search_after değerini sorgumuzu değiştirerek ilerletebiliyor olmamızdır. Scroll özelliğinde ise sorguyu bir kez gönderdikten sonra scroll_id ile ilerleyebiliyorduk. Buradaki sorgudan da göreceğimiz üzere rasgele erişimler için bu seçenekte çözüm değil. Ancak from & size özelliğini kullanarak erişemediğimiz verilerimize bu özellik sayesinde erişebileceğiz.

Kaynaklar