2015-03-09 2 views
0

Я использую Nest для подключения к ElasticSearch и выполнения некоторых запросов. До сих пор я был в состоянии получить результаты, я прошу данный одного запрос по шаблону, как показано ниже:Как найти несколько условий в ElasticSearch

var searchResults = _client.Search<MyIndexable>(
      body => 
      body 
       .Index("someIndex") 
       .Query(
        query => 
        query.QueryString(
         qs => qs. 
            OnFields(f => f.Title, f => f.Description) 
            .Query(searchTerm + "*")))); 

Но теперь мне нужно добавить дополнительные условия на мой запрос в течение определенного USECASE.

Что мне нужно не только запрос по [searchTerm]*, но и два другие поля соответствия:

  • SEARCHTERM + "*"
  • field1 = "некоторая строка"
  • field2 = " некоторые Руководящие принципы "

Я уверен, что должен быть способ сделать это в эластичном поиске (используя Nest), но я не смог его найти.

Я знаю, что я могу добавить два дополнительных поля в индекс (как в someIndex_field1_field2), и это определенно вариант для меня, так как field1 и field2 являются достойными разделами (и на самом деле это может быть намного лучший вариант, позволяющий лучшее разбиение), но я просто хотел посмотреть, есть ли способ избежать этого и вместо этого, если бы можно было добавить несколько условий для запроса.

Кто-нибудь знает, как этого достичь?

Большое спасибо,

ответ

4

Предполагая, что field1 и field2 просто еще поля, такие как Title и Description, вы можете использовать bool must запрос для достижения того, что вы хотите.

var searchResults = _client.Search<MyIndexable>(s => s 
    .Query(q => q 
     .Bool(b => b 
      .Must(
       subQuery => subQuery.QueryString(qs => qs.OnFields(f => f.Title, f => f.Description).Query(searchTerm + "*"")), 
       subQuery => subQuery.Term(f => f.field1, "some string"), 
       subQuery => subQuery.Term(f => f.field2 , "some Guid"))))); 
+0

спасибо. Я попробую это позже сегодня вечером, когда я вернусь домой. Один вопрос: лучше ли (с точки зрения устойчивости, производительности и т. Д.) Это делать, сопоставляя все поля или лучше использовать другой индекс для каждой комбинации поля 1 field +, если комбинация имеет конечное подмножество (скажем, 30 различных комбинаций), а затем вместо этого следует сопоставление на составном индексе? – kha

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