Задать вопрос

Как найти список точных совпадений фраз из БД в заданном тексте с помощью PHP?

Есть БД с 100к ключевых фраз, таких как:
большой дом
кафельная плитка
зеленая машина в саду

К нам приходит на обработку текст, вида:
В ноябре в Лондоне большой человек купил большой дом для своей большой семьи. В доме была кафельная панель.

Нужно найти в этом тексте все полные совпадения из БД, то есть в нашем случае:
большой дом
Пробовал FULLTEXT INDEX, запрос вида:
SELECT * FROM `phrases` WHERE MATCH(`phrase`) AGAINST('В ноябре в Лондоне большой человек купил большой дом для своей большой семьи. В доме была кафельная панель.')

Возвращает:
большой дом
кафельная плитка

Пробовал с использованием IN BOOLEAN MODE и сравнением кол-ва слов в фразе в БД с кол-вом найденых совпадений, но тогда соответственно вообще не получаю результатов.

Можно ли это как-то сделать на индексированном поисковом движке (будь то средства MySQL или Sphinx) и есть да, то как?

UPD. Судя по ответам, вопрос задан непонятно: у меня база коротких фраз (100000 фраз по 1-2 слова) и на вход я получаю текст (1000 слов). Я ищу текстом по фразам , а не наоборот. Текст не находится в БД и не проиндексирован. Его я получаю извне и не могу контроллировать. Мне нужно, получив текст, выдать для него подходящие фразы из БД.
  • Вопрос задан
  • 1778 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@Barakud Автор вопроса
На данный момент остановился на решении вида:
SELECT * FROM `phrases` WHERE MATCH(`phrase`) AGAINST('{$text}' IN BOOLEAN MODE)>=`numWords` AND LOCATE(`phrase`,'{$text}') > 0 ORDER BY `numWords` DESC

Функционально выполняет именно то, что нужно, но перформанс у такого запроса слабый, да и выглядит скорее как костыль. Буду пробовать еще на sphinxql.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
dimonchik2013
@dimonchik2013
non progredi est regredi
Фильтр блума пробуйте
исходные сортируйте и 2-3-4 словным наборам и каждый набор - в фильтр,
входящий - нарезайте по 4-3-2 и прогоняйте через фильтры

думаю, все же проше будет по-быстрому всунуть приходящий текст в RT индекс сфинкс и по всем фразам
php.net/manual/en/sphinxclient.setmatchmode.php SPH_MATCH_PHRASE
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
Нужно найти в этом тексте все полные совпадения из БД.

Тогда используйте простой поиск, а не умный:

SELECT * 
FROM `phrases`
WHERE 
    'В ноябре в Лондоне большой человек купил большой дом для своей большой семьи. В доме была кафельная панель.' 
    LIKE CONCAT('%', phrases.`phrase` , '%')
Ответ написан
Adamos
@Adamos
Инструменты для таких целей, насколько мне известно, выглядят примерно так:
- все фразы разбиваются на слова, у них ищется морфологическая основа
- в базе хранятся все слова и фразы, в которых они встречаются (точнее, уже id слова в таблице слов и id фразы в хранилище фраз - там необязательно хранится именно фраза, но она может быть оттуда восстановлена)
- по входящей фразе вы делаете то же самое - разбираете на слова и по базе находите фразы, в которых эти слова встречаются
Вот потом уже на этой, довольно ограниченной, выборке вы можете применять сколь угодно изощренный поиск.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы