ElasticSearch’te Collapse ile Sonuçları Tekilleştirme (E-Ticaret Varyasyon Senaryosu)

Elasticsearch ile bir e-ticaret sitesinin arama deneyimini iyileştirmeye çalışırken fark ettiğim bir sorunu sizlerle de paylaşmak istiyorum. Bu sayede “collapse” metodunu da birlikte incelemiş olacağız.

Sorun:

Varyasyonların bulunduğu bir e-ticaret sitesinde, özellikler varyasyonlar üzerinden ilişkilendirilir, bu nedenle aramalar da varyasyonlar üzerinden gerçekleştirilir. Ama arama sonuçları genelde ürünler üzerinden listelenir.

Örnek:

  • Nike Air Max – Kırmızı – 42
  • Nike Air Max – Kırmızı – 43
  • Nike Air Max – Siyah – 42

Arama sonuçlarımızda bu şekilde varyasyonlar oluşur.

Ama biz şunu isteriz:

  • Tek ürün kartı
  • İçinde varyasyonlar

Örnek varyasyon veri modeli:

JSON
{
  "id": "variant_1",
  "product_id": 1001,
  "product_name": "Nike Air Max",
  "color": "Kırmızı",
  "size": 42,
  "price": 3500,
  "stock": 5
}
JSON
{
  "id": "variant_2",
  "product_id": 1001,
  "product_name": "Nike Air Max",
  "color": "Kırmızı",
  "size": 43,
  "price": 3500,
  "stock": 3
}

Bu şekilde 100’lerce ürün/varyasyon olduğunu varsayalım. Kullanıcı nın “nike ayakkabılar” aramasını gerçekleştirdiğini düşünelim.

Bu durumda tüm ürünler arama sonuçlarında tekrar edecektir. Bunu önlemek için kullanacağımız özellik “collapse” özelliğidir.

Örnek Düzenlenmiş Sorgu:

JSON
GET products/_search
{
  "query": {
    "match": {
      "product_name": "nike"
    }
  },
  "collapse": {
    "field": "product_id"
  }
}

“collapse” özelliğini kullanarak arama sonuçlarında ne kadar tekrar ederse etsin aynı üründen 1 varyasyon göstermesini sağladık.

  • Ürünler product_id’ye göre gruplanmış oldu.
  • Her üründen bir sonuç göründü.

Ek olarakk varyasyonları da ilişkili olarak getirmek istersek “inner_hits” kullanabiliriz.

Böylelikle her ürün için bir ana ürün ve altında da sonuçlarla ilişkili varyasyonlar olacaktır.

JSON
GET products/_search
{
  "query": {
    "match": {
      "product_name": "nike"
    }
  },
  "collapse": {
    "field": "product_id",
    "inner_hits": {
      "name": "variants",
      "size": 5,
      "sort": [
        { "price": "asc" }
      ]
    }
  }
}

Ama bu ekstra performans kaybına yol açacaktır. Dikkatli kullanmalıyız.

Bunlara dikkat edelim:

  • “collapse” sadece keyword, numeric alanlarla çalışır.
  • “text” alanları ile çalışmaz
  • “doc_values” açık olmalıdır.

Bu yazımızda bir elastic search sorgusunu nasıl gruplarız ve tekrar eden sonuçlardan kurtuluruz bundan bahsettim. Bir sonraki yazıda görüşmek üzere.

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir