2016-04-12 3 views
0

У меня возникает проблема в фильтрации поиска, пытаясь сопоставить список значений.SQL IN Операторный эквивалент в Elastic Search с клиентом Nest

Вот мой код

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)))      
           )); 

Say есть 10 департаментов и я хочу, чтобы получить результаты из отдела D1, D2, D3 и D4. В основном я должен убедиться, что идентификаторы отдела в индексированном документе соответствуют любому из 4 отделов.

Поскольку количество идентификаторов отдела и их значения будут динамическими. Я хочу в основном найти эквивалент sql в операторе в NEST Client, чтобы я мог соответствующим образом фильтровать мой поиск.

+0

Что делать, если вы используете 'Terms' вместо' Term'? – Val

+0

Hi Val. Не могли бы вы привести пример использования терминов. –

+0

Попробуйте 'q.Terms (f => f.DeptId.ToLower(), DepartmentIds)' вместо 'q.Term (f => f.DeptId.ToLower(), DepartmentIds)' – Val

ответ

1

Вы можете использовать Terms query для этого

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)) 
     ) 
    ) 
); 

произведет следующий запрос

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

Имейте в виду, что wildcard queries can be slow and it is recommended not to start them with the * wilcard.

Вы можете посмотреть на completion suggesters за то, что вы делаете

+0

Спасибо вам, спасибо за рекомендацию. Как вы прогнозируете вывод запроса. Я использую Visual Studio. Есть ли способ, которым я могу получить выходной запрос? –

+0

Взгляните на https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/connecting.html#complex-logging для регистрации запросов и ответов. Я бы рекомендовал использовать это в разработке –

Смежные вопросы