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:
{
"id": "variant_1",
"product_id": 1001,
"product_name": "Nike Air Max",
"color": "Kırmızı",
"size": 42,
"price": 3500,
"stock": 5
}{
"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:
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.
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.

Bir yanıt yazın