Elasticsearch — Multiple Search Nedir ve Nasıl Kullanılır?
Merhabalar, bu yazımda Elasticsearch kullanarak multiple search işleminin nasıl gerçekleşeceğini anlatacağım.

Yazı içerisinde genel başlıklar şöyle olacak:
- Elasticsearch Nedir?
- Elasticsearch Çalışma Mantığı Nedir?
- Multiple Search Nedir?
- Multiple Search Nasıl Kullanılır?
Elasticsearch Nedir?
Elasticsearch, Apache Lucene tabanlı bir tam metin arama ve analiz motorudur. Elasticsearch, birden çok kaynaktan gelen veriler üzerinde analiz işlemlerini gerçekleştirmeyi ve depolanan veriler üzerinde Fuzzy Search (bulanık arama) gibi yapılandırılmamış sorgular çalıştırmayı kolaylaştırır.
Fuzzy Search: Bir veri içerisinde arayacağımız metnin yakın eşleşmesini (LIKE) hedefleyen arama türüdür.
Elasticsearch Çalışma Mantığı?
Elasticsearch, inverse indexing (ters indeksleme) olarak bilinen bir kavram üzerinde çalışır. Bu kavram her bir kelimenin hangi dökümanda bulunduğunu indexler. Elasticsearch’e herhangi bir veri kaydı gerçekleştirdiğimizde verilerimiz içerisindeki kelimelerin konumlarını bu kavram sayesinde indexleyerek kayıt eder. Bu sayede tüm veriler üzerinde arama yapmak yerine önceden indexlenen bu liste üzerinden arama işlemi gerçekleştirilerek sonuçlar hızlı bir şekilde elde edilir.

Multiple Search Nedir?
Multiple search, birden fazla arama sorgusunun eşzamanlı olarak yürütüldüğü bir işlemdir. Elasticsearch, multiple search işlemi sayesinde birden fazla sorguyu aynı anda işleyerek zaman kazandırır ve arama işleminin hızını arttırır.
Multiple Search Nasıl Kullanılır?
Multiple search kullanmak için Elasticsearch’te birden fazla arama sorgusu göndermemiz gerekmektedir. Bu sorgular, bir JSON verisi içinde yer alır tek istek içerisinde Elasticsearch’e gönderilir. Elasticsearch, sorguları eşzamanlı olarak işler ve sonuçları birleştirir.
Bir örnek ile multiple search’ü yakından inceleyelim. Öncelikle birbirinden farklı 3 adet sorgu oluşturalım.
Product
Bu query product index’i içerisinde is_active alanı 1 olan ve name alanı
yeni
keyword’ü ile başlayan ürünleri listeleyecektir.
{
"query": {
"bool": {
"must": [
{
"term": {
"tr.is_active": 1
}
},
{
"query_string": {
"query": "yeni*",
"fields": [
"tr.name"
]
}
}
]
}
}
}
Categories
Bu query categories index’i içerisinde is_active alanı 1 olan ve title, description alanları
yeni
keyword’ü ile başlayan kategorileri listeleyecektir.
{
"query": {
"bool": {
"must": [
{
"term": {
"tr.is_active": 1
}
},
{
"query_string": {
"query": "yeni*",
"fields": [
"tr.title",
"tr.description"
]
}
}
]
}
}
}
Brand
Bu query brand index’i içerisinde is_active alanı 1 olan ve name, slug, type alanları yeni keyword’ü ile başlayan markaları listeleyecektir.
{
"query": {
"bool": {
"must": [
{
"term": {
"tr.is_active": 1
}
},
{
"query_string": {
"query": "yeni*",
"fields": [
"tr.name",
"tr.slug",
"tr.type"
]
}
}
]
}
}
}
Query’lerimizi oluşturduk. Şimdi query’leri birleştirip tek bir çoklu arama sorgusu haline getireceğiz.
Bunun için yapmamız gereken her bir query’imizin bir üst satırına hangi index içinde çalışacağını belirten {“index”: “index_name”} şeklinde bir ifade eklemek. Sorgunun son hali aşağıdaki gibi olacaktır.
{"index":"products"},
{"query": { "bool": { "must": [ { "term": { "tr.is_active": 1 } }, { "query_string": { "query": "fıstı*", "fields": [ "tr.name" ] } } ] } } }
{"index":"categories"},
{"query": { "bool": { "must": [ { "term": { "tr.is_active": 1 } }, { "query_string": { "query": "fıstı*", "fields": [ "tr.title", "tr.description" ] } } ] } } }
{"index":"brands"},
{"query": { "bool": { "must": [ { "term": { "tr.is_active": 1 } }, { "query_string": { "query": "fıstı*", "fields": [ "tr.name", "tr.slug", "tr.type" ] } } ] } } }
Query çalıştırmak için Elasticsearch’in rest arayüzünü kullanacağız. http://elastichost:port/_msearch adresine post işlemi gerçekleştirip body içerisine sorgumuzu yazıyoruz.
Header bölümünde Content-Type: application/x-ndjson olarak tanımlanmalıdır. Ayrıca body içerisinde bu verileri gönderirken, her bir veri ayrı bir satırda olmalıdır. ndjson hakkında detaylı bilgiye http://ndjson.org/ ulaşabilirsiniz.
İstek yanıtı olarak aşağıdaki veriyi elde ediyoruz. Görüldüğü üzere, belirttiğimiz 3 farklı index için arama işlemini gerçekleştirerek, her index için ayrı sonuçlar elde ettik.
{
"took": 9,
"responses": [
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 3.0,
"hits": [
{
"_index": "categories",
"_type": "_doc",
"_id": "458",
"_score": 3.0,
"_source": {
"__soft_deleted": 0,
"image": {
"path": null,
"size": null,
"type": null,
"title": null,
"alt": null
},
"tr": {
"name": "Yeni Eklenenler",
"slug": "yeni-eklenenler",
"keyword": "yeni-eklenenler",
"is_active": 1,
"locales": [
"tr"
]
}
}
}
]
},
"status": 200
},
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 203,
"relation": "eq"
},
"max_score": 3.0,
"hits": [
{
"_index": "brands",
"_type": "_doc",
"_id": "42719",
"_score": 3.0,
"_source": {
"__soft_deleted": 0,
"image": {
"path": null,
"size": null,
"type": null,
"title": null,
"alt": null
},
"tr": {
"name": "A. Özge Yenice Ceylan",
"slug": "a-ozge-yenice-ceylan",
"is_active": 1,
"keyword": "a-ozge-yenice-ceylan"
}
}
}
]
},
"status": 200
},
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2633,
"relation": "eq"
},
"max_score": 5.0,
"hits": [
{
"_index": "products",
"_type": "_doc",
"_id": "410008",
"_score": 5.0,
"_source": {
"quantity": 100,
"price": 75.0,
"tr": {
"name": "Deprem Tahmininde Yeni Metodlar",
"slug": "deprem-tahmininde-yeni-metodlar",
"keyword": "deprem-tahmininde-yeni-metodlar",
"is_active": 1
}
}
}
]
},
"status": 200
}
]
}
Sonuç
Multiple search yapısı gereği biraz karışık olduğu için anlatım veya verilen query örnekleri de karmaşık gelebilir. İşin özü, birden fazla index’te arama işlemini aynı anda yapmak ve tek bir response içerisinde tüm indexlerin arama sonucunu elde etmek istiyorsak msearch yapısı kullanılmalıdır. Bu yapının kullanımına ait bir örneğin görselini aşağıya bırakıyorum, göz atabilirsiniz.


Vakit ayırdığınız için teşekkürler.
Kaynak: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html