2016-09-30 59 views
0

我有多種類型的Es索引,並且每種類型都迎合它自己的過濾器參數。現在我們在Es上爲多種類型構建一個全局搜索,並且我有點困惑如何使用類型特定的where子句來包含在NEST中。 彈性搜索 - >類型1(其中x = 1) - >類型2(其中y = 1)Elasticsearch需要從多種類型中搜索具體類型where子句

現在我們正在建立一個搜索查詢

var result = client.Search<ISearchDto>(s => s 
 
       .From(from) 
 
       .Size(PageSize) 
 
       .Types(lstTypes) 
 
       .Query(q => q.QueryString(qs => qs.Query(query))) 
 
       );

* lstTypes將有類型1和類型2

現在我怎麼能爲x = 1的所有類型1項目添加where子句,並且在NEST中爲y = 1的所有類型2項目添加。

希望這個問題很明確,對此的任何幫助將不勝感激。

回答

1

您可以使用與查詢任何其他字段非常相似的方式在_type元字段上進行查詢。要執行基於一個搜索查詢中不同類型的查詢,您可以使用bool查詢與多個子句

client.Search<ISearchDto>(s => s 
    .From(from) 
    .Size(pageSize) 
    .Type(Types.Type(typeof(FirstSearchDto), typeof(SecondSearchDto))) 
    .Query(q => q 
     .Bool(b => b 
      .Should(sh => sh 
       .Bool(bb => bb 
        .Filter(
         fi => fi.Term("_type", "firstSearchDto"), 
         fi => fi.Term(f => f.X, 1) 
        ) 
       ), sh => sh 
       .Bool(bb => bb 
        .Filter(
         fi => fi.Term("_type", "secondSearchDto"), 
         fi => fi.Term(f => f.Y, 1) 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

我們有一個bool查詢與2項should條款;每個should子句是一個bool查詢,連接條件爲2 filter,一個用於_type,另一個用於分別查詢每個類型的屬性。

NEST支持操作符重載所以該查詢可以被寫入更簡潔地與

client.Search<ISearchDto>(s => s 
    .From(from) 
    .Size(pageSize) 
    .Type(Types.Type(typeof(FirstSearchDto), typeof(SecondSearchDto))) 
    .Query(q => (+q 
     .Term("_type", "firstSearchDto") && +q 
     .Term(f => f.X, 1)) || (+q 
     .Term("_type", "secondSearchDto") && +q 
     .Term(f => f.Y, 1)) 
    ) 
); 

兩者產生以下查詢

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "bool": { 
      "filter": [ 
       { 
       "term": { 
        "_type": { 
        "value": "firstSearchDto" 
        } 
       } 
       }, 
       { 
       "term": { 
        "x": { 
        "value": 1 
        } 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "filter": [ 
       { 
       "term": { 
        "_type": { 
        "value": "secondSearchDto" 
        } 
       } 
       }, 
       { 
       "term": { 
        "y": { 
        "value": 1 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
相關問題