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
]
}
}
}
}