我正在尝试执行基本的登录操作,在该操作中,我的视图(前端部分)通过表单接受用户名和密码
因此在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 运算符,而不是将它们匹配在一起
仅供参考,如果您想知道为什么会根据上面的“ hits”属性显示如此多的文档,那么实际上有很多使用相同密码的用户文档
主要问题
是否有适当的ES查询来正确匹配我的用户名 AND
密码,所以我只能检索一个文档?我一直在搜索官方文档,但是没有什么能成功获得所需的输出
非常感谢您!
答案 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"
]
]
]
]
]
]
]
];