Hi I am using below query in nest
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)))));
and below is json query generated for the same
{"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}}}]}}}
Even though I am passing value for 1st should clause for father_first_name it is only taking last should clause for father_last_name. Ironically if I comment out last should clause for father_last_name and keep 1st should clause it starts taking 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)))));
Will return
{"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}}}]}}}
How to add multiple should to the query
.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)))))
You're calling Should(..)
twice, with the second invocation overriding the value set in the first. Should
takes a params Func<QueryContainerDescriptor<T>, QueryContainer>[]
so the invocation should look like similar to your Must()
call
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, this can be shortened to
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))
))
)
);