2017-01-30 41 views
0

我嘗試建立一個必須在elasticsearch請求和應要求 我的目標要求是這樣的波紋管:巢:建立與必須在QueryContainer請求和應約束

POST /index/type/_search 
{ 
    "query": { 
    "bool" : { 
     "must" : { 
     "match":{"field1":{"query":"word1"}} 
     }, 
     "should":{ 
     "match":{"field2":{"query":"word2"}} 
     } 
    } 
    }} 

我寫道:

var queryContainer = new QueryContainer(); 
queryContainer &= new MatchQuery() { Field = "field1", Query = "word1" }; 
queryContainer |= new MatchQuery() { Field = "field2", Query = "word2"}; 


var searchRequest = new SearchRequest<type> 
     { 
      Query = queryContainer 
     }; 

,但它產生了我:

POST /index/type/_search 
{ 
    "query":{ 
    "bool":{ 
     "should":[ 
     {"match":{"field1":{"query":"word1"}}}, 
     {"match":{"field2":{"query":"word2"}}}] 
    } 
    } 
} 

你知不知道我應該怎麼寫WH建立我的QueryContainer?

回答

1

在這裏使用運算符重載沒有多大幫助;我認爲,在這種情況下,構建bool查詢更清晰

對象初始化語法

var searchRequest = new SearchRequest<Document>() 
{ 
    Query = new BoolQuery 
    { 
     Must = new QueryContainer[] { new MatchQuery() { Field = "field1", Query = "word1" } }, 
     Should = new QueryContainer[] { new MatchQuery() { Field = "field2", Query = "word2" } } 
    } 
}; 

client.Search<Document>(searchRequest); 

或流利的API

client.Search<Document>(s => s 
    .Query(q => q 
     .Bool(b => b 
      .Must(fi => fi 
       .Match(m => m 
         .Field("field2") 
         .Query("word2") 
       ) 
      ) 
      .Should(sh => sh 
       .Match(m => m 
         .Field("field1") 
         .Query("word1") 
       ) 
      ) 
     ) 
    ) 
);