0

嗨,我在鳥巢多發性應該而且必須在布爾查詢

   Query<Person> 
       .Bool(fd => fd 
        .Must(must => must 
        .Match(m => m 
        .Field("first_name") 
        .Query(p.first_name) 
        .Fuzziness(Fuzziness.EditDistance(2))), 
        must => must 
         .Match(ln => ln 
         .Field("last_name") 
         .Query(p.last_name) 
         .Fuzziness(Fuzziness.EditDistance(2)))) 

         .Should(ffn => ffn 
         .Match(m => m 
         .Field("father_first_name") 
         .Query(p.father_first_name) 
         .Fuzziness(Fuzziness.EditDistance(2)))) 
          .Should(fln => fln 
          .Match(m => m 
          .Field("father_last_name") 
          .Query(p.father_last_name) 
          .Fuzziness(Fuzziness.EditDistance(2))))); 

及以下使用下面的查詢是針對同一

 {"query":{"bool":{"must":[{"match":{"first_name": 
    {"query":"abigail","fuzziness":2}}},{"match":{"last_name": 
    {"query":"may","fuzziness":2}}}],"should":[{"match": 
    {"father_last_name":{"query":"s","fuzziness":2}}}]}}} 

產生JSON查詢即使我傳遞價值1日應子句爲father_first_name,它只爲father_last_name取最後一個子句。諷刺的是,如果我最後註釋掉應該爲father_last_name條款,並保持1應該子句它開始採取father_first_name

Modified nest query with only 1 should clause 
    Query<Person> 

       .Bool(fd => fd 
        .Must(must => must 
        .Match(m => m 
        .Field("first_name") 
        .Query(p.first_name) 
        .Fuzziness(Fuzziness.EditDistance(2))), 
        must => must 
         .Match(ln => ln 
         .Field("last_name") 
         .Query(p.last_name) 
         .Fuzziness(Fuzziness.EditDistance(2)))) 

         .Should(ffn => ffn 
         .Match(m => m 
         .Field("father_first_name") 
         .Query(p.father_first_name) 
         .Fuzziness(Fuzziness.EditDistance(2))))); 

將返回

 {"query":{"bool":{"must":[{"match":{"first_name": 
    {"query":"abigail","fuzziness":2}}},{"match":{"last_name": 
    {"query":"may","fuzziness":2}}}],"should":[{"match": 
    {"father_first_name":{"query":"t","fuzziness":2}}}]}}} 

如何多增加應當向查詢

   .Bool(fd => fd 
        .Must(must => must 
        .Match(m => m 
        .Field("first_name") 
        .Query(p.first_name) 
        .Fuzziness(Fuzziness.EditDistance(2))), 
        must => must 
         .Match(ln => ln 
         .Field("last_name") 
         .Query(p.last_name) 
         .Fuzziness(Fuzziness.EditDistance(2)))) 
         .Should(should => should 
         .Match(m => m 
         .Field("father_first_name") 
         .Query(p.father_first_name) 
         .Fuzziness(Fuzziness.EditDistance(2))), 
         should => should.Match(m => m 
          .Field("father_last_name") 
          .Query(p.father_last_name) 
          .Fuzziness(Fuzziness.EditDistance(2)))), 
          should => should.Match(m => m 
           .Field("mother_first_name") 
           .Query(p.mother_first_name) 
           .Fuzziness(Fuzziness.EditDistance(2))))) 

回答

1

你調用Should(..)兩次,第二次調用覆蓋第一次調用的值。 Should需要params Func<QueryContainerDescriptor<T>, QueryContainer>[]所以調用看起來應該像類似於您的通話Must()

client.Search<Person>(s => s 
    .Query(q => q 
     .Bool(fd => fd 
      .Must(must => must 
       .Match(m => m 
        .Field("first_name") 
        .Query("first name") 
        .Fuzziness(Fuzziness.EditDistance(2)) 
       ), 
      must => must 
       .Match(ln => ln 
        .Field("last_name") 
        .Query("last name") 
        .Fuzziness(Fuzziness.EditDistance(2)) 
       ) 
      ) 
      .Should(should => should 
       .Match(m => m 
        .Field("father_first_name") 
        .Query("father first name") 
        .Fuzziness(Fuzziness.EditDistance(2)) 
       ), 
       should => should 
        .Match(m => m 
         .Field("father_last_name") 
         .Query("father last name") 
         .Fuzziness(Fuzziness.EditDistance(2)) 
        ) 
       ) 
      ) 
     ) 
    ); 

With operator overloading,這可以縮短到

client.Search<Person>(s => s 
    .Query(q => q 
     .Match(m => m 
      .Field("first_name") 
      .Query("first name") 
      .Fuzziness(Fuzziness.EditDistance(2)) 
     ) && q 
     .Match(ln => ln 
      .Field("last_name") 
      .Query("last name") 
      .Fuzziness(Fuzziness.EditDistance(2)) 
     ) && (q 
      .Match(m => m 
       .Field("father_first_name") 
       .Query("father first name") 
       .Fuzziness(Fuzziness.EditDistance(2)) 
      ) || q 
      .Match(m => m 
       .Field("father_last_name") 
       .Query("father last name") 
       .Fuzziness(Fuzziness.EditDistance(2)) 
      )) 
     ) 
    ); 
+0

感謝@Russ凸輪 – Sushil

+0

我怎樣才能增加更多的應該以同樣要=>應該從句......看我編輯的問題 – Sushil