布尔查询中的多个应该和必须
Mutiple should and must in boolean query
您好,我在嵌套中使用以下查询
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)))));
及以下是针对相同
生成的json查询
{"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}}}]}}}
即使我为 father_first_name 的第一个 should 子句传递值,它也只为 father_last_name 传递最后一个 should 子句。具有讽刺意味的是,如果我注释掉 father_last_name 的 last should 子句并保留 1st should 子句,它开始采用 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)))));
会 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}}}]}}}
如何在查询中添加多个 should
.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)))))
您调用了 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))
))
)
);
您好,我在嵌套中使用以下查询
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)))));
及以下是针对相同
生成的json查询 {"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}}}]}}}
即使我为 father_first_name 的第一个 should 子句传递值,它也只为 father_last_name 传递最后一个 should 子句。具有讽刺意味的是,如果我注释掉 father_last_name 的 last should 子句并保留 1st should 子句,它开始采用 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)))));
会 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}}}]}}}
如何在查询中添加多个 should
.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)))))
您调用了 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))
))
)
);