Kategori: Veri ve Raporlama

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

    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.