Perl MongoDB API - регулярное выражение в фильтрах - PullRequest
0 голосов
/ 02 сентября 2018

Я работаю в Perl с MongoDB. У меня есть коллекция с документами, имеющими большое текстовое поле, и мне нужно найти все строки, содержащие несколько строк в этом поле.

Так, например, если это база данных цитат из фильмов, одна строка будет иметь значение:

Мы должны полностью уничтожить все производство специй на Арракисе. Гильдия и вся вселенная зависит от специй. Тот, кто может уничтожить вещь, контролирует вещь.

Я хочу иметь возможность сопоставить эту строку с терминами "специя", "Арракис" и "Гильдия", где ВСЕ эти термины должны быть в тексте.

Мой нынешний подход может достичь совпадений только в том случае, если указанные условия оказываются в правильном порядке, т.е.

$db->get_collection( 'quotes' )->find( { quote => qr/spice.*Arrakis.*Guild/i } );

Это совпадение, но

$db->get_collection( 'quotes' )->find( { quote => qr/Guild.*spice.*Arrakis/i } );

не совпадает.

Если бы я работал с базой данных SQL, я мог бы сделать:

... WHERE quote LIKE '%spice%' and quote LIKE '%Arrakis%' and quote LIKE '%Guild%'

но с интерфейсом MongoDB вы получаете только один выстрел на поле.

Есть ли способ сопоставить несколько слов, когда все требуются в одном регулярном выражении, или есть другой способ получить более одного трещины в поле в интерфейсе MongoDB?

1 Ответ

0 голосов
/ 02 сентября 2018

В одну сторону: куча позитивных прогнозных утверждений:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
my @tests = ("The Guild demands that the spice must flow from Arrakis",
             "House Atreides will be transported to Arrakis by the Guild.");
for my $test (@tests) {
  if ($test =~ m/^(?=.*spice)
                  (?=.*Guild)
                  (?=.*Arrakis)/x) {
    say "$test: matches";
  } else {
    say "$test: fails";
  }
}

производит:

Гильдия требует, чтобы специя вытекала из Арракиса: соответствует

Герцог Лето будет перевезен в Арракис гильдией: провал

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