Elasticsearch - DSL sorgusu

Elasticsearch'de JSON tabanlı sorgu kullanılarak arama yapılır. Bir sorgu iki maddeden oluşur -

  • Leaf Query Clauses - Bu maddeler, belirli bir alanda belirli bir değeri arayan eşleşme, terim veya aralıktır.

  • Compound Query Clauses - Bu sorgular, istenen bilgileri çıkarmak için yaprak sorgu cümlelerinin ve diğer bileşik sorguların bir kombinasyonudur.

Elasticsearch çok sayıda sorguyu destekler. Bir sorgu, bir sorgu anahtar sözcüğü ile başlar ve ardından içinde JSON nesnesi biçiminde koşullar ve filtreler içerir. Farklı sorgu türleri aşağıda açıklanmıştır.

Tüm Sorguları Eşleştir

Bu en temel sorgudur; tüm içeriği ve her nesne için 1.0 puanını döndürür.

POST /schools/_search
{
   "query":{
      "match_all":{}
   }
}

Yukarıdaki kodu çalıştırdığımızda şu sonucu alıyoruz -

{
   "took" : 7,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         },
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Tam Metin Sorguları

Bu sorgular, bir bölüm veya bir haber makalesi gibi tüm metnin tamamını aramak için kullanılır. Bu sorgu, o belirli dizin veya belge ile ilişkili analizöre göre çalışır. Bu bölümde, farklı tam metin sorgu türlerini tartışacağız.

Sorguyu eşleştir

Bu sorgu, bir metin veya kelime öbeğini bir veya daha fazla alanın değerleriyle eşleştirir.

POST /schools*/_search
{
   "query":{
      "match" : {
         "rating":"4.5"
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 44,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.47000363,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 0.47000363,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Çoklu Eşleme Sorgusu

Bu sorgu, birden fazla alan içeren bir metin veya kelime öbeğiyle eşleşiyor.

POST /schools*/_search
{
   "query":{
      "multi_match" : {
         "query": "paprola",
         "fields": [ "city", "state" ]
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 12,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.9808292,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 0.9808292,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         }
      ]
   }
}

Sorgu Dizesi Sorgusu

Bu sorgu, sorgu ayrıştırıcı ve sorgu_dizesi anahtar sözcüğünü kullanır.

POST /schools*/_search
{
   "query":{
      "query_string":{
         "query":"beautiful"
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 60,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
      "value" : 1,
      "relation" : "eq"
   },
………………………………….

Terim Düzeyinde Sorgular

Bu sorgular esas olarak sayılar, tarihler ve numaralandırmalar gibi yapılandırılmış verilerle ilgilenir.

POST /schools*/_search
{
   "query":{
      "term":{"zip":"176115"}
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

……………………………..
hits" : [
   {
      "_index" : "schools",
      "_type" : "school",
      "_id" : "5",
      "_score" : 0.9808292,
      "_source" : {
         "name" : "Central School",
         "description" : "CBSE Affiliation",
         "street" : "Nagan",
         "city" : "paprola",
         "state" : "HP",
         "zip" : "176115",
         "location" : [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

Aralık Sorgusu

Bu sorgu, verilen değer aralıkları arasında değerlere sahip nesneleri bulmak için kullanılır. Bunun için aşağıdaki gibi operatörler kullanmamız gerekiyor -

  • gte - eşitten büyük
  • gt - büyüktür
  • lte - eşittir
  • lt - küçüktür

Örneğin, aşağıda verilen kodu inceleyin -

POST /schools*/_search
{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 24,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Aşağıdakiler gibi başka terim düzeyi sorgu türleri de vardır:

  • Exists query - Belirli bir alanın boş olmayan değeri varsa.

  • Missing query - Bu, var olan sorgunun tam tersidir, bu sorgu, belirli alanlar veya boş değerli alanlar olmayan nesneleri arar.

  • Wildcard or regexp query - Bu sorgu, nesnelerdeki desenleri bulmak için normal ifadeler kullanır.

Bileşik Sorgular

Bu sorgular, ve, veya değil veya farklı endeksler veya işlev çağrıları vb. Gibi Boolean operatörleri kullanılarak birbiriyle birleştirilen farklı sorgular koleksiyonudur.

POST /schools/_search
{
   "query": {
      "bool" : {
         "must" : {
            "term" : { "state" : "UP" }
         },
         "filter": {
            "term" : { "fees" : "2200" }
         },
         "minimum_should_match" : 1,
         "boost" : 1.0
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 6,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 0,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   }
}

Coğrafi Sorgular

Bu sorgular coğrafi konumları ve coğrafi noktaları ele alır. Bu sorgular, herhangi bir konuma yakın okulları veya diğer coğrafi nesneleri bulmaya yardımcı olur. Coğrafi nokta veri türünü kullanmanız gerekir.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{  "acknowledged" : true,
   "shards_acknowledged" : true,
   "index" : "geo_example"
}

Şimdi verileri yukarıda oluşturulan dizine gönderiyoruz.

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

Yukarıdaki kodu çalıştırırken, yanıtı aşağıda gösterildiği gibi alıyoruz -

{
   "took" : 1,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         "_index" : "geo_example",
         "_type" : "_doc",
         "_id" : "hASWZ2oBbkdGzVfiXHKD",
         "_score" : 1.0,
         "_source" : {
            "name" : "Chapter One, London, UK",
            "location" : {
               "type" : "point",
               "coordinates" : [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }