Elasticsearch: "Terim", "Eşleme İfadesi" ve "Sorgu Dizesi" arasındaki fark


116

Elasticsearch'te yeni ve bu sorgular arasındaki farkı daha iyi anlamaya çalışmak. Anlayabildiğim kadarıyla, termtek bir terimle eşleşir (eşleşmenin çalışması için küçük harf olması gerekir?) Ve her ikisiyle de eşleşir match phraseve query stringbir metin dizesiyle eşleşir.

Yanıtlar:


226

termsorgu olduğu gibi tek bir terimle eşleşir: değer analiz edilmez . Dolayısıyla, indekslediğiniz şeye bağlı olarak küçük harfle yazılması gerekmez.

BennettDizin zamanında sağladıysanız ve değer analiz edilmezse aşağıdaki sorgu hiçbir şey döndürmez:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase sorgu, sorgulanan alan için çözümleyiciler tanımlanırsa girdiyi analiz eder ve aşağıdaki kriterlere uyan belgeleri bulur:

  • tüm terimler alanda görünmelidir
  • giriş değeriyle aynı sıraya sahip olmalıdırlar

Örneğin, aşağıdaki belgeleri dizine eklerseniz ( standardalan için analizörü kullanarak foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Bu match_phrasesorgu yalnızca birinci ve ikinci belgeleri döndürür:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringaynı anda birkaç metin alanının metnini içeren bir _all alanında varsayılan olarak sorgu araması . Üstelik ayrıştırılır ve bazı operatörleri (VE / VEYA ...), joker karakterleri ve benzerlerini destekler ( ilgili sözdizimine bakın ).

Olarak match_phrasesorgular, giriş sorgulanan alanın üzerinde analiz seti göre analiz edilir.

match_phraseKullanıcı girdinin etrafında tırnak işaretleri kullanmadıkça, analizden sonra elde edilen terimlerin tersine aynı sırada olması gerekmez.

Örneğin, öncekiyle aynı belgeleri kullanarak, bu sorgu tüm belgeleri döndürür:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Ancak bu sorgu, sorgu ile aynı 2 belgeyi döndürecektir match_phrase:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Bu sorgular için farklı seçenekler hakkında söylenecek çok şey var, lütfen ilgili belgelere bir göz atın:

Umarım bu yeterince açıktır ve yardımcı olacaktır.


Harika, harika ve kapsamlı bir açıklama!
Net olmadığım

1
Rica ederim :) Analizciler, sonunda indekslenen / aranan terimleri elde etmek için metni işler. ElasticSearch Definitive Guide'ın bu sayfalarını okuyun çünkü bu, anlaşılması gerçekten önemli bir kavramdır.
ThomasC

1
Evet SQL'den geliyorum, burada birçok yeni fikir var. Sorgular ve filtreler arasındaki fark, tam değerler ile tam metin, JSON arama nesnesi ve elastik aramanın aramayı yürütme şekli. ALMAK İÇİN ÇOK ŞEY !!! Kaynak için teşekkürler!
blee908

1
@ThomasC Dizininizde {"foo": "Merhaba güzel dünya"} varsa, eşleşme sorgusu bunu döndürür mü?
batmaci

1
@batmaci bir matchsorgu alan analiz edilirse analizörü kullanır, yani evet. Varsayılan olarak, terimlerden en az birine (parametreye bakın operator) sahip belgeleri döndürür ve sıra önemli değildir.
ThomasC

17

Sanırım birileri KISMİ ARAMA açısından kesinlikle aralarındaki farkları arıyor İşte benim varsayılan 'standart analizör' ile analizim : -

Diyelim ki, elimizde veriler var: -

{"name": "Merhaba"}

Şimdi ell ile kısmi arama yapmak istersek ???

Terim Sorgusu VEYA Eşleşme sorgusu

{"term":{"name": "*ell*" }

Çalışmayacak, not ederek dönün.

{"term":{"name": "*zz* *ell*" }

Çalışmayacak, not ederek dönün.

Sonuç - Terim veya Maç hiçbir şekilde kısmi arama yapamaz

joker karakter Sorgusu: -

{"wildcard":{"name": "*ell*" }

Çalışacak sonucu {"name": "Merhaba"} verecek

{"wildcard":{"name": "*zz* *ell*" }

Çalışmayacak, not ederek dönün.

Sonuç - joker karakter yalnızca bir jetonla kısmi arama yapabilir

Sorgu_dizesi: -

{"query_string": {"default_field": "name","query": "*ell*"}

Çalışacak sonuç {"name": "Merhaba"} verir

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Çalışacak sonucu {"name": "Merhaba"} verir.

Sonuç - query_string iki jetonla arama yapabiliyor

-> buradaki simge ell ve zz'dir


wildcard is able to do partial search with one token only: daha doğrusu, wildcardsorgular varsayılan olarak yalnızcakeyword tanım gereği tek belirteç olan alanlarda çalışır . Bunun, alan içeriğinin birden fazla sözcük olmasıyla ilgisi yoktur. Joker karakterli sorgunuzda "ozzy merhaba" eşleşecektir.
sox, Monica ile
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.