Kibana Query Language (KQL) nedir?

27 Haz

Kibana Query Language (KQL), Kibana uygulamasında kullanılan bir sorgulama dilidir. Bu dil, Kibana uygulamasındaki Discover bölümünün en temel bileşenidir. KQL sayesinde Elasticsearch üzerindeki index’lerde basit bir şekilde arama işlemleri gerçekleştirilebilmektedir. Yazılan basit sorgular, arka planda otomatik olarak Elasticsearch DLS query formatına dönüştürülerek aramalar yapılmaktadır.

Kibana Query yazma penceresi

Örnek KQL kodu:

product.price : 200

Dönüştürülmüş Elasticsearch query kodu:

 "query": {
   "bool": {
	"filter": [
	  {
		"bool": {
		  "should": [
			{
			  "match": {
				"product.price": "200"
			  }
			}
		  ]
		}
	  }
	]
  }
}

Karmaşık Elasticsearch DSL sorguları tek bir satırda basit bir şekilde KQL ile gerçekleştirilebilmektedir.

KQL free text search

Her bir kelimeyi ayrı ayrı arayıp bulmak için kelimeler arasında boşluklar bırakılarak yapılan aramalardır. Örneğin içinde apple veya banana geçen dokümanları elde etmek için aşağıdaki gibi aralarında boşluklar bırakarak arandığında ilgili Elasticsearch DSL sorgusu üretilecektir. Free text search, elastic tarafında multi_match türünde bir filter uygular. Dokümandaki tüm alanlarda ilgili kayıtların aranması sağlanır. Bunu sağlayan “best_fields” parametresidir.

apple banana
"query": {
  "bool": {
	"filter": [
	  {
		"multi_match": {
		  "type": "best_fields",
		  "query": "apple banana",
		  "lenient": true
		}
	  }
	]
  }
}

KQL free text – phrase search

Bu tür aramalarda, ilgili metin tırnak içinde aratılarak ilgili kelime veya cümle ile tam eşleşen dokümanlar aranmaktadır. Bunu sağlayan “phrase” parametresidir. Örneğin “apple banana” araması yapıldığında, doküman alanlarında aranan metni aynı şekilde arar. apple ve banan şeklinde ayırıp aramaz.

"apple banana"
"query": {
  "bool": {
	"filter": [
	  {
		"multi_match": {
		  "type": "phrase",
		  "query": "apple banana",
		  "lenient": true
		}
	  }
	]
  }
}

KQL field level search

Bu aramalarda arama kutusuna <field name><operator><value> şeklinde giriş yapılır.

product.name: computer

Bu aramalarda; “:” operatörü eşittir anlamına gelmektedir. Bu aramanın DSl sorgusu aşağıdaki gibidir.

"query": {
  "match": {
	"product.name": "computer"
  }
}
Range Operatörleri:    <      >      <=      >=

Bu operatörlerin DSL dönüşümü aşağıdaki gibidir.

product.price < 2500 
"query": {
  "range": {
	"product.name": { "lt": 250 }
  }
}

KQL boolean operators

product.size >= 100 and product.size <= 500
"query": {
  "bool": {
	"filter": [
	  {
		"range": {
		  "product.size ": { "gte": 100 }
		}
	  },
	  {
		"range": {
		  "product.size ": { "lte": 500 }
		}
	  }
	]
  }
}
product.size: 100 or product.size: 500
"query": {
  "bool": {
	"should": [
	  {
		"match": {
		  "product.size ": 100
		}
	  },
	  {
		"match": {
		  "product.size ": 500 
		}
	  }
	]
  }
}

Boolean kısa yazım şekli

product.size: ( 100 or 500 )

KQL boolean operator grup

Sorgulamalarda parantezlar yardımı ile boolean ifadeler gruplanabilir.

product.price: 1500 and (product.size: M or Product.size: L)

KQL boolean ters

İfadelerin başına “not” yazılarak ters mantıksal işlem yapılabilir. Örneğin kategorisi “computers” olmayanlar için sorgu:

not product.category: computers

Gruplanmış ifadelerde de ters mantıksal işlemler kulanılabilir.

product.price: 1500 and not (product.size: M or Product.size: L)

Wildcard (*) ifadesiyle ilgili alana sahip dokümanların aranması

İlgili alana sahip olan dokümanların aranması için aşağıdaki sorgu kullanılabilir. Örneğin product.category alanını içeren dokümanları aramak için:

product.category: *
"query": {
  "exist": {
	"field": "product.name"
  }
}

Wildcard (*) ifadesiyle ilgili alana ve değere sahip dokümanların aranması

product.category: phones*
"query": {
  "query_string": {
	"fields": ["product.name"],
        "query": "phones*"
  }
}