У меня есть коллекция книг в моей базе данных МонгоМонго регулярного выражение не соответствует слову расположения строки префикса
{
"title": "Some cool title",
"authors": [ "Author1", "Author2", ... ],
...
}
Я хочу, чтобы создать достаточно умный поисковик для этих книг. Если пользователь вводит что-то на вход поиска, это происходит: входную строку
- Преобразовать в массив ключевых слов
- поиск всех документов, в которых по крайней мере один ключевом слове соответствует названию или имя любого автора
Тогда Я делаю с ней немного волшебства, но мне нужна помощь в этом - когда я говорю, что ключевое слово соответствует заголовку/автору, я имею в виду, что оно соответствует некоторому слову в заголовке/авторе или его префиксе. Например, do
будет соответствовать любой строке, содержащей do
, 10, double
в ней, но не ado
или badoo
.
Я гугле его, и это должно быть правильный способ сделать это:
public function searchBooksByKeywords($keywords) {
array_walk($keywords, function(&$keyword) {
$keyword = preg_quote($keyword, "/");
});
$filter = array(
'$or' => [
[ "title" => new \MongoRegex("/\\b(" . implode('|', $keywords) . ")/i") ],
[ "authors" => new \MongoRegex("/\\b(" . implode('|', $keywords) . ")/i") ],
]
);
$books = $this->database->Books->find($filter);
return \iterator_to_array($books);
}
Это не работает. Я все еще получаю результаты, такие как steal
для tea
, то есть он соответствует даже подстрокам внутри слов, а не только префиксам. Я здесь довольно утерян ...
BTW, я использую PHP.
EDIT: Я нашел вероятную причину проблемы. В случае совпадения внутри слова искомое слово происходит сразу после некоторого символа, отличного от ASCII (но, может быть, и не для всех), например, я искал sto
и получил результаты, такие как Město & město
, для ste
найдено Kroatien Dalmatinische Küste
и Ostseeküste,Darss,Rostock
и т. Д.
Вы распечатали строку регулярных выражений образца, чтобы увидеть, как она выглядит? – sln
Ну, например, если вы ищете 'steve jobs', строка регулярного выражения будет'/\ b (steve | jobs)/i' –