Индексированный нечеткий поиск

InstantCMS 2.X
#1 12 октября 2021 в 14:55

Может быть кто-то делал на icms? 
Попробовал по-быстрому на коленке, но что-то не совсем то выходит…
В общем, установил на icms библиотеку TNTSearch: github.com/teamtnt/tntsearch
Индексирую демо-данные — Новости, входящий в комплект поставки icms. Вот эти.

  1. use TeamTNT\TNTSearch\TNTSearch;
  2.  
  3. $tnt = new TNTSearch;
  4.  
  5. $tnt->loadConfig([
  6. 'driver' => 'mysql',
  7. 'host' => 'localhost',
  8. 'database' => 'test_db',
  9. 'username' => 'test_usr',
  10. 'password' => 'test_pass',
  11. 'storage' => '/var/www/my_user/data/www/tnt',
  12. 'stemmer' => \TeamTNT\TNTSearch\Stemmer\PorterStemmer::class,//optional
  13. 'charset' => 'utf8',
  14. ]);
  15.  
  16. $indexer = $tnt->createIndex('news.index'); // создаю индекс новостей в sqlite
  17. $indexer->query('SELECT id, title, content FROM cms_con_news;'); // выбираю заголовки и содержание новостей для индекса
  18. $indexer->setLanguage('russian');
  19. $indexer->run();
  20.  

Индекс создался. В storage появился файл news.index.
ОК!
Делаю запрос с намеренной ошибкой в слове «Россия»:

  1. $tnt->selectIndex("news.index");
  2. $tnt->fuzziness = true;
  3. $res = $tnt->search("росия");
  4.  
  5. print_r($res);

Вернет новость с id 7… Вообще-то я ждал, как минимум 3 новости:

  1. Россияне стали первыми на Чемпионате Мира
  2. Количество преступлений в России сокращается
  3. Все больше россиян покупают дома за границей

Или $tnt->search(«россиян»); — вроде две новости должно вернуться. Но вернется одна: 

  1. Все больше россиян покупают дома за границей.

ЗАТО! $tnt->search(«компани»); Без окончания и с «о» вместо «а» в первом слоге.Две новости (по содержанию)! Работает как надо.

  1. Array ( [ids] => Array ( [0] => 4 [1] => 5 ) [hits] => 2 [execution_time] => 0.5431 ms )

ID4: … изложенной выше, консолидирует стиль менеджмента, используя опыт предыдущих кампаний. VIP-мероприятие...
ID5:… бюджеты. Продукт, анализируя результаты рекламной кампании, концентрирует культурный...

Что за дичь… И почему так? Почему на одном слове работает нормально, а на другом слове нет?? Я пробовал менять расстояние Левенштейна и др. параметры, но особого успеха это не приносит.
Может кто какие другие библиотеки пробовал?

#2 12 октября 2021 в 15:20

Можно посмотреть в сторону: Manticore Search, форк Sphinx Search. Или остановиться на Sphinx, который даже иногда стоит по умолчанию на некоторых VPS. Это достаточно надежно и просто. Это быстро. ИМХО, если поиск прям так страшно необходим определенного качества, то лучше использовать подобные системы. 

Сам использую Manticore Search, практически всегда, если нужна локальная индексация. TNTSearch не знаю, не могу ничего сказать.

#3 12 октября 2021 в 15:40

Manticore Search, форк Sphinx Search. Или остановиться на Sphinx, который даже иногда стоит по умолчанию на некоторых VPS. Это достаточно надежно и просто. Это быстро. ИМХО, если поиск прям так страшно необходим определенного качества, то лучше использовать подобные системы. 

Evg

Ну, понятно, что на крестах оно работает быстро) Просто такого огромного кол-ва записей в таблицах пока нет, думал на PHP обойтись. Тем более TNTSearch поддерживается в Laravel. В любом случае, спасибо. Пока немного покопаюсь с TNTSearch, если уж не судьба, то буду на эти движки смотреть. А Вы тестили и Sphinx и Manticore Search? В чем отличие?   

#4 12 октября 2021 в 16:02

В чем отличие? 

Absolute134

Детали: habr.com/ru/post/541126/

На самом деле, думаю, можно ставить то, что удобно. Sphinx нормальный, Manticore. Elasticsearch многие используют. Мой интерес к Manticore Search просто вызван личными мотивами, знакомый позвал. Собственно можно и  Sphinx ковырять. За последнее время там много изменений.

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.