2015-10-20 8 views
9

Bir Elasticsearch endeksini bir zaman aralığına göre sorgulamaya çalışıyorum ve ayrıca bir terimin belirli bir dize değeriyle eşleşmesini sağlamaya çalışıyorum.Bir aralık ve bir terim eşleşme json biçimini birleştirerek Elasticsearch sorgulama

ben oldukça basit görünüyor, bu sorguyu çalıştık: Bu durumda

{ 
    "query" : { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range" : { 
      "startTime": { 
       "from" : "2015-10-20T13:00-04:00", 
       "to" : "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

, ben de "/customer/help" yöntemi değerine sahip belirli bir zaman aralığında belgelerin hepsini istiyorum.

Sonuçlarımda, zaman aralığı içinde sonuçlar alıyorum, ancak "method" alanı için yalnızca "/customer/help" ile sonuç istediğimde çeşitli değerler içeren belgeler alıyorum. eşlemenizde olarak

+1

Beklenen "müşteri/yardıma" sahip sonuçlarla birlikte "müşteri" veya "yardıma" sahip "yöntem" alan değerleri için çeşitli değerler var mı? Bu durumda sorun, Elasticsearch'in alanı analiz etmesidir (muhtemelen haritalamayı belirlemediyseniz Standart analizör). Gelecekte bu alan için analiz cihazını kullanmayı düşünmüyorsanız, o alan için "index": "not_analyzed" özelliğini ayarlayabilirsiniz. – eemp

+0

Diğer değerlerin müşterisi var> ancak garip olan şu ki, aralık dışında olduğum bir sorguyu ayrı olarak çalıştırıyorsam, yalnızca method = "customer/help" sonucunu elde ederim. –

+0

Boyut param için ne geçiyorsunuz? Sadece bir tesadüf mi ve aralık sorgusunu kestiğinde sadece tüm sonuçların bir alt kümesini görüyor musunuz? – eemp

cevap

13

Eğer not_analyzed olarak method (veya keyword analizörü ile analiz edilir) olması gerekir ve sorgu term kullanmalıdır. Bu şekilde, yöntemde endeks olarak dizine metin tek nişanesi olarak ve term arama metni tam olarak method dizine belirteci ile eşleşen emin olur: Kullanmak için gereken

"method": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 

Ve sorguyu:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range": { 
      "startTime": { 
       "from": "2015-10-20T13:00-04:00", 
       "to": "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Evet, sonuç olarak bu dizginin tokenize edilmesi sonuçların daraltılmasıydı. Bu cevap doğru ve teşekkürler! Ayrıca, "eşleşme" sorgusu yerine "match_phrase" sorgusunu kullanmanın indeksi değiştirmeden doğru sonuçlara ulaştığını belirtmenin yararlı olacağını düşündüm. –

İlgili konular