Ne zaman bir sorgu veya bir filtre veya ikisinin bazı kombinasyonu kullanmanız gerektiğini hiçbir açıklama göremiyorum. Onların arasındaki fark ne? Herkes açıklayabilir mi?
Ne zaman bir sorgu veya bir filtre veya ikisinin bazı kombinasyonu kullanmanız gerektiğini hiçbir açıklama göremiyorum. Onların arasındaki fark ne? Herkes açıklayabilir mi?
Yanıtlar:
Fark basittir: filtreler önbelleğe alınır ve skoru etkilemez, bu nedenle sorgulardan daha hızlıdır. Buraya da bir göz atın . Diyelim ki bir sorgu genellikle kullanıcıların yazdığı ve neredeyse tahmin edilemeyen bir şeyken filtreler kullanıcıların arama sonuçlarını daraltmasına yardımcı olur.
Resmi belgeler şöyle diyor:
Genel bir kural olarak, sorgular yerine filtreler kullanılmalıdır:
- ikili evet / hayır aramaları için
- kesin değerler hakkındaki sorgular için
Genel bir kural olarak, filtreler yerine sorgular kullanılmalıdır:
- tam metin araması için
- sonucun alaka düzeyine bağlı olduğu durumlarda
Dizin dizininde myindex
üç belge vardır:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
Sorgu: Bir belgenin sorguyla ne kadar iyi eşleştiği
hello sam
(anahtar kelime kullanarak must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
İlkinden sorgudaki her iki kelimeyle eşleştiğinden, "Hello world! I am Sam."
dokümana göre daha yüksek bir puan verilir "Hello world!"
. Belgeler puanlanır.
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
Filtre: Bir belgenin sorguyla eşleşip eşleşmediği
hello sam
(anahtar kelime kullanarak filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
İçeren hello
veya sam
döndürülen belgeler . Belgeler puanlanmıyor .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
Aynı daha az ekleme. Önce bir filtre uygulanır ve ardından sorgu sonuçları üzerinden işlenir. Her belge için ikili doğru / yanlış eşleşmeyi saklamak için bitSet Array adı verilen bir şey kullanılır. Bu BitSet dizisi bellekte ve bu filtre ikinci kez sorgulandığında kullanılır. Bu şekilde, bitset dizi veri yapısını kullanarak, önbelleğe alınan sonucu kullanabiliyoruz.
Burada dikkat edilmesi gereken bir nokta daha var, filtre önbelleği yalnızca istek yürütüldüğünde oluşturulur, bu nedenle yalnızca ikinci isabette, önbelleğe alma avantajından yararlanırız.
Ancak daha sonra bunu aşmak için daha sıcak API kullanabilirsiniz . Daha sıcak bir API'ye karşı filtreli bir sorgu kaydettiğinizde, canlı yayınlandığında bunun yeni bir segmente karşı yürütüldüğünden emin olur. Bu nedenle, ilk yürütmenin kendisinden tutarlı bir hız elde edeceğiz.
Temel olarak, puanlama ile belgeleriniz üzerinde arama yapmak istediğinizde bir sorgu kullanılır. Ve sorgu kullanılarak elde edilen sonuç kümesini daraltmak için filtreler kullanılır. Filtreler boolean.
Örneğin, zomato gibi bir restoran indeksiniz olduğunu varsayalım. Şimdi , temel olarak arama anahtar kelimeniz olan 'pizza' sunan restoranları aramak istiyorsunuz .
Yani "pizza" içeren tüm belgeleri bulmak için sorgu kullanacak ve bazı sonuçlar elde edilecektir.
Diyelim ki pizza servisi yapan ve en az 4.0 puan alan bir restoran listesi istersiniz.
Yapmanız gereken, sorgunuzda "pizza" anahtar kelimesini kullanmak ve filtreyi 4.0 olarak derecelendirmek için uygulamaktır.
Olan şey, filtrelerin genellikle dizininizi sorgulayarak elde edilen sonuçlara uygulanmasıdır.
Filters
-> Bu belge eşleşiyor mu? ikili evet veya hayır yanıtı
Queries
-> Bu belge eşleşiyor mu? Ne kadar iyi uyuyor? puanlama kullanır
Elasticsearch'ün 2. sürümünde, filtreler ve sorgular birleştirildiğinden ve herhangi bir sorgu cümlesi bir filtre veya sorgu olarak (bağlama bağlı olarak) kullanılabilir. Sürüm 1'de olduğu gibi, filtreler önbelleğe alınır ve puanlama önemli değilse kullanılmalıdır.