【问题标题】:Mutiple should and must in boolean query布尔查询中的多个应该和必须
【发布时间】:2017-10-30 13:15:40
【问题描述】:

您好,我在嵌套中使用以下查询

                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 取last should 子句。具有讽刺意味的是,如果我注释掉 parent_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)))));

会回来

     {"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)))))

【问题讨论】:

    标签: elasticsearch nest elasticsearch-plugin elasticsearch-marvel


    【解决方案1】:

    您调用了两次Should(..),第二次调用覆盖了第一次调用中设置的值。 Should 采用 params Func&lt;QueryContainerDescriptor&lt;T&gt;, QueryContainer&gt;[],因此调用应该类似于您的 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))
                ))
            )
        );
    

    【讨论】:

    • 如何在相同的 should => should 子句中添加更多 should ... 查看我编辑的问题
    猜你喜欢
    • 2016-11-02
    • 2017-03-27
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多