2016-04-12 26 views
0

Değerleri eşleştirmek için aramayı filtrelemede sorun yaşıyorum.SQL IN Operatör eşdeğeri, Nest İstemcisi ile Elastik Arama

İşte

List<string> DepartmentIds = new List<string>(){"d1","d2","d3","d4"}; 

term = "*" + "akshay" + "*" 

var searchResults = client.Search<Employee>(c => c 
          .Index(index) 
          .Type(type) 
          .Query(+q.Term(f => f.DeptId.ToLower(), DepartmentIds)) // Facing Issue in Matching list of Department IDs 
          && ((q.Wildcard(wc => wc.Field(f => f.FirstName).Value(term)))       
           || (q.Wildcard(wc => wc.Field(f => f.LastName).Value(term)))      
           )); 

orada 10 bölüm ve i departmanı D1, D2, D3 ve D4 gelen sonuçlarını getirmek istediğini söyle benim Kod olduğunu. Temel olarak, indeksli belgede bulunan bölümlerin 4 bölümden herhangi biri ile eşleşip eşleşmediğini görmeliyim.

Departman kimlikleri ve değerleri dinamik olacağından. Temel olarak NEST İstemcisinde operatörde sql eşdeğerini bulmak istiyorum, böylece aramamı uygun şekilde filtreleyebilirim.

+0

Ne kullanırsanız 'Terms' yerine' Term' ait ne işin var? – Val

+0

Merhaba Val. Terimlerini kullanma ile ilgili bir örnek verebilir misiniz? –

+0

'q.Terms (f => f.DeptId.ToLower(), DepartmentIds)' yerine q.Term (f => f.DeptId.ToLower(), DepartmentIds) ' – Val

cevap

1

Aklında şu sorgu

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "bool": { 
      "filter": [ 
       { 
       "terms": { 
        "deptId": [ 
        "d1", 
        "d2", 
        "d3", 
        "d4" 
        ] 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "should": [ 
       { 
       "wildcard": { 
        "firstName": { 
        "value": "*akshay*" 
        } 
       } 
       }, 
       { 
       "wildcard": { 
        "lastName": { 
        "value": "*akshay*" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

Ayı wildcard queries can be slow and it is recommended not to start them with the * wilcard olduğunu üretecek bu

List<string> departmentIds = new List<string>() { "d1", "d2", "d3", "d4" }; 

var term = "*" + "akshay" + "*"; 
var index = "index"; 
var type = "type"; 

var searchResults = client.Search<Employee>(c => c 
    .Index(index) 
    .Type(type) 
    .Query(q => 
     +q.Terms(t => t 
      .Field(f => f.DeptId) 
      .Terms<string>(departmentIds) 
     ) && (
      q.Wildcard(wc => wc.Field(f => f.FirstName).Value(term)) || 
      q.Wildcard(wc => wc.Field(f => f.LastName).Value(term)) 
     ) 
    ) 
); 

için Terms query kullanabilirsiniz.

Sen için completion suggesters bakmak isteyebilirsiniz

Eğer

+0

Teşekkür ederim Rus, ayrıca joker tavsiye için teşekkür ederiz. Sorgunun çıktısını nasıl tahmin edersiniz? Visual Studio kullanıyorum. Çıkış sorgusunu alabileceğim bir yol var mı? –

+0

https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/connecting.html#complex-logging istekleri ve yanıtları için bir göz atın. Bunu geliştirmede kullanmanızı öneririm –