Sorgular ve Filtreler


198

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?


46
Resmi belgeler aslında çok açık değil
geekazoid

2
Görünüşe göre daha gelişmiş bir açıklamaya sahip bir sayfa var: elastik.co/guide/tr/elasticsearch/guide/master/…
Dmitry Polushkin

6
ES 2.0'da sorguların ve filtrelerin birleştirileceğini belirtmek gerekir , bu nedenle sorgulara karşı filtreler için söylenen ve yazılanların çoğu artık geçerli olmayacaktır. Ayrıca bu değişikliği bildiren resmi blog gönderisine de bakın .
Val

Yanıtlar:


201

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.


19
Öyleyse, kullanıcı bir google türü arama yapıyorsa bir sorgu kullanır mıydım? Bir açılır menüden olası değeri seçiyorlarsa (örneğin, fatura sayısı> 50) bu bir filtre olur mu?
Ocak'ta Jonesie

4
Evet, bu kesinlikle doğru. Tüm belge kümesini bir metrikle sınırlamanız gerektiğinde, bu genellikle bir filtrenin uygun olduğu bir durumdur. Yani belki yaş, uzunluk, boyut vb. Göre
Zach

Çözümüm, filtreleri ve sorguları aynı istekte kullanır ve test veritabanında süper hızlıdır. Ne kadar hızlı olduğunu görmek için yakında canlı verileri alacağız.
Jonesie

@Zach Kesin olarak açık olmak gerekirse, çok kiracılı bir sistemde (kiracının içindeki kullanıcılar için izinlerle), kiracı / kimlik doğrulama bilgileri her sorguya eklenen bir filtre (örn. Filtrelenmiş Sorgu) gibi görünmektedir. Sağ?
Scott Willeke

4
@activescott Evet, ben de öyle yapardım. Ayrıca, "kullanıcı takma adları" her zaman uygun filtreyi uygulamak için filtrelenmiş takma adlar da ayarlayabilirsiniz. Yönetimi kolaylaştırır ve sorguları güncellemek için kod değişiklikleri gerektirmez, sorgunuzda fazladan bilgi, vb.
Zach

99

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

belgeyi silmek istediğimde mümkünse filtre kullanmalı mıyım? Önbelleğe alınmasını istemiyorum
Rytek

bir dokümanı silerken puan almanıza veya tam metin araması yapmanız gerekmez. Bu, bir silme / silme kararı vermeniz gerektiğinden, bu bir filtre olacaktır. filter-query-context
nonNumericalFloat

13

Bir örnek (kendiniz deneyin)

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

Sorgu 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

Filtre hello sam(anahtar kelime kullanarak filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

İçeren helloveya samdö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."
     }
   ...

Tam metin aramasına veya puanlamaya ihtiyacınız olmadığı sürece, filtreler tercih edilir, çünkü sık kullanılan filtreler performansı hızlandırmak için Elasticsearch tarafından otomatik olarak önbelleğe alınır. Bkz. Elasticsearch: Bağlama ve filtre bağlamı.


11

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.


1
İlginç! Filtrelerin sorgulardan önce gerçekleştiğini fark etmedim. Filtrelerin önbelleğe alınması şimdi daha mantıklı.
Constant Meiring

Her zaman değil. Filtrelenmiş ve sabit puan sorgusu arasındaki temel ve birincil fark. Sabit puan her zaman önce sorguyu yürütür ve ardından üzerine filtre uygular. Filtrelenmiş sorgu bile, sorgunun filtrelerden önce yürütülebileceği ayarlara sahiptir.
piyushGoyal

10

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.


Bir talep organına örnek verebilir misiniz?
Köpek

9

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


0

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.

Kaynak: https://logz.io/blog/elasticsearch-queries/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.