Как мы можем рассматривать группы цифр как строки в полнотекстовом поиске mongodb?
В определенном поле идентификатора мы индексируем документ так: 1234 45676
Мы хотим иметь возможность выполнять полнотекстовый поиск по каждой из 2 групп чисел, как если бы они были строками. Я избегаю числовых групп в кавычках, которые, как говорится в документации по монго, будут искать всю строку.
Например, если в индексированном поле есть слово "синий", то будет выполняться поиск только слова "синий". Поиск по "b" не приведет к попаданию. (в настоящее время мы используем нестематический поиск).
Но это не результат с группами чисел. Несмотря на то, что мы избегаем наших групп номеров с кавычками ("45676"), группы номеров подвергаются поиску с подстановочными знаками. В нашем примере поиск по "4" будет попадать по "45676".
Как мы можем гарантировать, что "45676" будет считаться строкой, которая даст попадание, только если будет выполнен поиск "45676"?
Все предложения или перспективы приветствуются! Заранее спасибо.
1 ответ
Есть два решения для поиска группы чисел как уникального отдельного слова.
1) Используйте оператор $text и текстовый индекс
2) Используйте оператор $regexp или регулярное выражение.
Настроить:
db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
{ _id: 1, txt : "Log 1: Page 23 1234 45676" },
{ _id: 2, txt : "Log 2: Page 45 0000 00000" },
{ _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);
1. Пример использования оператора $text
Индексировать поле поиска
db.a.ensureIndex({ txt : "text" });
Запрос с использованием оператора $text
db.a.find({ $text : { $search : "45" } });
Выход
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
Обратите внимание, что вывод не возвращает документ с _id 1, даже если он содержит 45676
,
2. Пример использования регулярного выражения
Для регулярного выражения вам нужно заключить числа в границу слова, \b
, чтобы избежать их соответствия в строке.
Пример: поиск 4
без границы слова.
/4/.test("4") == true
/4/.test("1234") == true
В поисках 4
с границей слова.
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
Ищите 45, используя регулярное выражение
db.a.find({ txt : /\b45\b/ });
Выход
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
Вы можете сформировать регулярное выражение из пользовательского ввода с помощью следующих функций.
function escapeRegExp(str) {
return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\\$&");
}
function wordToRegExp( query ){
return new RegExp( "\\b" + escapeRegExp( query ) + "\\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.
db.a.find({ txt : queryForWord });
Больше информации: