Aşağıdaki örnekler elasticsearch 1.7 versiyonu ile test edilmiştir. Eğer sizin sisteminizdeki versiyon farklı ise, çalışma veya çalışmama gibi bir durum ile karşılaşabilirsiniz. Eğer sorgu hata verirse, aşağıdaki yöntemle sorguyu kontrol edip hatanın ne olduğunu görebilirsiniz.


curl -XGET '127.0.0.1:9200/product_test/_validate/query?explain=true&pretty=1' -d '
{
your query goes here
}'

Queries ve Filters


Elasticsearch sınırsız sayıda olmak üzere, tek bileşen setlerinden, yani sorgulardan oluşmaktadır. Setler aşağıda açıklandığı gibi "filtering" bağlamı veya "query" bağlamı olarak ikiye ayrılırlar. Daha fazla bilgi için Queries and Filters sayfasını ziyaret edin.



Performans



Genel olarak filtering (non-scoring) sorguları, scoring sorgularından daha performanslı olurlar.

Genel kural: Eğer full-text arama yapılacaksa veya alaka sonucunun önemi varsa "scoring" sorgusu, aksi takdirde "filtering (non-scoring)" sorgusu kullanılmalıdır.


En önemli sorgular


Her ne kadar kullanabileceğimiz çok sorgu çeşidi olsa da, biz bunların bazılarını diğerlerine göre daha sıklıkla kullanırız. En önemli sorluların listesi aşağıdaki gibidir. Daha fazla bilgi için Most Important Queries sayfasını ziyaret edin.


match_all


Bu sorgu arama yapmaksızın tüm dökümanları verir.


# Give me all documents.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"match_all": {}
}
}'

match


Eğer full-text veya kesin değer araması yapacaksanız, %99 ihtimalle bu sorguyu kullanacaksınız.


# Give me documents where "Product1" keyword found in "name" mapping.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"match": {
"name": "Product1" # Full-text (analyzed) field
}
}
}'

# Give me documents where "id" mapping equals to "1".
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"match": {
"id": 1 # Exact-value (not_analyzed) field
}
}
}'

Öneri: Eğer kesin değer araması yapacaksanız, query bileşeni yerine filter bileşenini kullanın çünkü filter hafızada tutulur.


multi_match


Bu match ile aynıdır ama birden fazla alanı sorgular. Kısacası OR kondisyonu gibidir.


# Give me documents as long as "Product1" keyword is found either in "name" or "shops.name" mappings.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"multi_match": {
"query": "Product1",
"fields": [
"name", # Full-text (analyzed) field
"shops.name" # Exact-value (not_analyzed) field
]
}
}
}'

range


Belirlenen kondisyona uyan rakam veya tarihleri aramada kullanılırlar. Mevcut kondisyonlar:



# Give me documents where "id" mapping equals to "4/5/6".
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"range": {
"id": {
"gte": 4,
"lt": 7
}
}
}
}'

term


Sadece rakam, tarih, boolean veya not_analyzed string gibi kesin değerleri aramada kullanılır. Kısacası full-text aramaları için kullanılmazlar.


# Give me documents where "shops.name" mapping equals to "Shop7".
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"term": {
"shops.name": "Shop7" # Exact-value (not_analyzed) field
}
}
}'

# Give me only searchable documents.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"term": {
"is_searchable": true # Exact-value (not_analyzed) field
}
}
}'

terms


Bu term ile aynıdır ama birden fazla değeri sadece bir alanda ararlar. Kısacası OR kondisyonu gibidirler.


# Give me documents as long as "Shop4" or "Shop7" keywords are found "shops.name" mapping.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"terms": {
"shops.name": ["Shop4", "Shop7"] # Exact-value (not_analyzed) field
}
}
}'

# Give me documents where IDs equal to "4" or "7" in "id" mapping.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"terms": {
"id": [4, 7] # Exact-value (not_analyzed) field
}
}
}'

missing


Bu, belirlenen alanda bilgi bulunmadığını doğrulamak için kullanılır. Kısacası field = '' veya field IS NULL kondisyonu gibidir.


# Give me documents where "name" mapping has NULL or no data in it.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"filtered": {
"filter": {
"missing": {
"field": "name"
}
}
}
}
}'

exists


Bu, belirlenen alanda bilgi bulunduğunu doğrulamak için kullanılır. Kısacası field <> '' veya field IS NOT NULL kondisyonu gibidir.


# Give me documents where "name" mapping has data in it.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"filtered": {
"filter": {
"exists": {
"field": "name"
}
}
}
}
}'

Sorguları birleştirmek


Birden fazla sorguyu birleştirmek için bool sorgusu kullanılır ve bu aşağıdaki parametreleri destekler. Daha fazla bilgi için Combining queries sayfasını ziyaret edin.



Aşağıdaki sorguda dökümanların sonuçta yerlerini almaları için 2 kondisyonu mutlaka tatmin etmeleri gerekir. Bununla birlikte, bulunan dökümanların alaka değerlerini belirlemek için 2 kural bulunur. Aşağıdaki yorumları okuyun.


curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"bool": {
"must": {
"match": {
"name": "Product" # Make sure document "name" contains "Product" keyword. Include.
}
},
"must_not": {
"match": {
"name": "Product1" # Make sure document "name" does not contain "Product1" keyword. Exclude.
}
},
"should": [
{
"match": {
"id": 7 # If document "id" equals to "1" then score it higher so it appears higher. Scoring.
}
},
{
"range": {
"year": {
"gt": "2014" # If document "year" greater than "2014" then score them higher so they appear higher. Scoring.
}
}
}
]
}
}
}'

Not: Eğer must kondisyonu yok ise, en azından bir tane should kondisyonu uymalıdır. Fakat, eğer en azından bir tane must değeri var ise, her hangi bir şekilde should kondisyonun uymasına gerek yoktur.


Filtering sorgusu ekleme


Yukarıdaki mantığın aksine, eğer "year" alanına bakarak bulunan dökümanların değerleriyle oynamak istemiyorsanız, filter işlemi yapmanız gerekir. Eğer range bloğunu filter bloğuna taşırsanız, sorgu "non-scoring" sorgusu olarak değişir ve böylece performansta artar.