Elasticsearch [查询布尔值必须匹配]执行或运算,而不是与运算符

时间:2019-06-24 10:47:03

标签: php laravel elasticsearch

我正在尝试执行基本的登录操作,在该操作中,我的视图(前端部分)通过表单接受用户名和密码

因此在SQL中,我必须有一个示例查询:

SELECT * FROM users WHERE username = $_POST['username'] AND password = $_POST['password'];

根据Elasticsearch PHP API的官方文档,它必须像这样:

$params = [
'index' => 'myIndex',
'type'  => 'myType',
'body'  => [
        'query' => [
            "bool" => [
                "must" => [
                    "match" => [ 
                        "username" => 'email@email.com',
                    ],
                    "match" => [
                        "password" => 'mypassword',
                    ],
                ]
            ]
        ]
    ]
];

不幸的是,它正在显示很多文档,因此我认为它正在执行 OR 运算符,而不是将它们匹配在一起

enter image description here

仅供参考,如果您想知道为什么会根据上面的“ hits”属性显示如此多的文档,那么实际上有很多使用相同密码的用户文档

主要问题
是否有适当的ES查询来正确匹配我的用户名 AND 密码,所以我只能检索一个文档?我一直在搜索官方文档,但是没有什么能成功获得所需的输出

非常感谢您!

2 个答案:

答案 0 :(得分:4)

您快到了。您需要将match查询附加到另一个数组中,否则bool /必须成为关联数组,而这并不是您想要的(即,第二个匹配过滤器被丢弃)。

$params = [
'index' => 'myIndex',
'type'  => 'myType',
'body'  => [
        'query' => [
            "bool" => [
                "must" => [
            -->   [
                    "match" => [ 
                        "username" => 'email@email.com',
                    ]
            -->   ],
            -->   [
                    "match" => [
                        "password" => 'mypassword',
                    ]
                  ]
            --> ]
            ]
        ]
    ]
];

答案 1 :(得分:0)

在Val爵士的帮助下,我能够制定一种技术来尝试查询的变通方法,并且能够显示以下结果:

$params = [
'index' => $index,
'type'  => 'index',
'size'  => 250,
'body'  => [
        'query' => [
            'bool' => [
                'must' => [
                    [
                        "match" => [
                            "usr_username" => 
                                [
                                    "query" => $username,
                                    "operator" => "and"
                                ]
                        ]
                    ],
                    [
                        "match" => [
                            "usr_password" => [
                                "query" => $password,
                                "operator" => "and"
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
];

enter image description here