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.
Ö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*"
}
}