LIKE
поиск будет работать, просто они, как правило, намного медленнее, потому что им нужен доступ к строке, а не к индексу. Использование подстановочных знаков с обеих сторон компаратора гарантирует, что он не будет использовать индекс с LIKE
^.
Однако, если вы сделаете поле FULLTEXT
доступным для поиска, вы получите лучшие инструменты поиска, включая сопоставление подстрок. MySQL после 5.6 позволяет также использовать FULLTEXT
на InnoDB.
Заимствование из ответа Фрэнка Б. Вот что-то похожее. Не забудьте также запустить
bin/console d:s:u --force
.
/**
* @Entity
* @Table(indexes={
@Index(name="search_idx", flags={"fulltext"}, columns={"col1", "col2", "col3"})
})
*/
class SomeEntity
{
...
class SomeEntityRepository
{
public function search($searchTerm)
{
return $this->createQueryBuilder('r')
->where('MATCH(col1, col2, col3) AGAINST(:term IN NATURAL LANGUAGE MODE')
->setParameter('term', $searchTerm)
->getQuery()
;
}
...
^ Если термин имеет подстановочный знак только справа ('brown %'
), может использовать индекс для LIKE
.