искать подстроку в монге
Первый способ, который я пробовал - через regex .*substring.* получается слишком долгий запрос
Второй способ через полнотекстовый поиск с построением текстового индекса. Работает быстро, но ищет только по словам, а мне нужно именно каждое вхождение найти
Может есть какое-то другое быстрое и удовлетворяющее задаче решение?
Поиск по подстроке в принципе сложная задача, так как подстроки очень дорого индексировать. К сожалению, для монги простой ответ «никак». Полнотекстовый индекс не поддерживает частичное совпадение по токену, только по его оригинальной словоформе. Нормализация происходит в момент обработки $text запроса, а дальше поиск по сути похож на поиск по multi-key индексу, с той разницей что «сортировка» будет по «коэффициенту совпадения» Если вы можете выделять нужные вам токены при записи, а это достаточно легко для иерархических строк, например FQDN, то эти токены можно хранить в индексируемом массиве. Если выделить подстроку при записи нельзя, то попробовать выделить префикс подстроки и записать её в индексируемый массив. В остальных случаях, дешевле использовать сторонний инструмент, который строит индексы через разновидности trie.
Спасибо огромное за развёрнутый ответ, читал про решение с разбиением строки на токены, но к сожалению, строки совсем не структурированы, буду рассматривать использование elasticsearch, так как он больше подходит для данной задачи
Вы упомянули сторонник инструмент с trie индексами, можете что-то посоветовать?
Обсуждают сегодня