Elasticsearch [Query Bool Must Match] выполняет операцию ИЛИ вместо И - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь выполнить базовую операцию входа в систему, где мое представление (передняя часть) принимает имя пользователя и пароль через форму

Так что в 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',
                    ],
                ]
            ]
        ]
    ]
];

К сожалению, он отображает LOT документов, поэтому я предположил, что он выполняет оператор OR вместо того, чтобы сопоставлять их вместе

enter image description here

К вашему сведению, если вы когда-нибудь задумаетесь, почему так много документов отображается в соответствии с указанным выше свойством «совпадения», буквально много пользовательских документов с одним и тем же паролем

Главный вопрос
Есть ли какой-нибудь правильный запрос ES, который бы соответствовал моему имени пользователя AND паролю , чтобы я мог получить только один документ? Я искал с официальной документацией, но ничего не получается желаемый вывод

Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 24 июня 2019

Ты почти у цели.Вам нужно заключить ваши match запросы в еще один массив, иначе ваш bool / must станет ассоциативным массивом, а это не то, что вам нужно (т. Е. Второй фильтр соответствия отбрасывается).

$params = [
'index' => 'myIndex',
'type'  => 'myType',
'body'  => [
        'query' => [
            "bool" => [
                "must" => [
            -->   [
                    "match" => [ 
                        "username" => 'email@email.com',
                    ]
            -->   ],
            -->   [
                    "match" => [
                        "password" => 'mypassword',
                    ]
                  ]
            --> ]
            ]
        ]
    ]
];
0 голосов
/ 24 июня 2019

С помощью сэра Вала я смог сформулировать методику, позволяющую попробовать обходные пути для моего запроса, и смог отобразить результат с помощью следующего:

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...