30/08/2017 - ELASTICSEARCH
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
}'
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.
_score
(alaka) değerini belirler.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.
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.
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": {}
}
}'
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.
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
]
}
}
}'
Belirlenen kondisyona uyan rakam veya tarihleri aramada kullanılırlar. Mevcut kondisyonlar:
gt
: Daha büyükgte
: Daha büyük veya eşitlt
: Daha küçüklte
: Daha küçük veya eşit# 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
}
}
}
}'
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
}
}
}'
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
}
}
}'
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 hasNULL
or no data in it.
curl -XPOST '127.0.0.1:9200/product_test/_search?pretty' -d '
{
"query": {
"filtered": {
"filter": {
"missing": {
"field": "name"
}
}
}
}
}'
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"
}
}
}
}
}'
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.
must
: Dökümanın bulunduğunu varsaymak için, belirlenen kondisyonun tutması mecburidir.must_not
: Dökümanın bulunduğunu varsaymak için, belirlenen kondisyonun tutmaması mecburidir.should
: Belirlenen kondisyonun tutması durumunda, dökümanın _score
(alaka) değeri arttırılır, aksi takdirde hiç bir sonuca değer katmazlar. Ana amaç dökümanın alaka değeriyle oynamaktır ki bu onu "scoring" sorgusu olarak tanımlar.filter
: Kondisyonun tutması durumunda döküman sonuçta yerini alır, aksi takdirde yerini almaz. Bunun dökümanın alaka değeri _score
üzerinde hiçbir etkisi yoktur ki bu onu "non-scoring" sorgusu olarak tanımlar.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.
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.