Создание удобного поиска для фильтрации

Я плохо разбираюсь в проблеме поиска. Я действительно использовал sql только с подобными запросами и т. Д.

Мне нужно создать поиск для фильтрации файлов и товаров. Итак, учитывая имя файла: company_launch 2019.png

Если вы начали искать что-либо из нижеприведенного, как и следовало ожидать, этот файл будет возвращен:

  • ком
  • 2019
  • запуск
  • ланч
  • _запуск
  • .png

так далее

Это для php-сайта laravel. Я просмотрел https://github.com/teamtnt/tntsearch, но не смог что для соответствия лучше, чем точное слово / слово минус несколько символов. Было также больше крайних случаев, которые означали, что ожидаемое выше поведение не сработало.

Сейчас я ищу эластичный поиск. У меня есть базовое представление о концепции ngram и о том, как это связано с поиском части слова, однако я не уверен, достаточно ли этого + нечеткого сопоставления для выполнения этого поиска. Пока я могу получить только точные совпадения, как и раньше.

Может ли кто-нибудь помочь мне указать правильное направление для поиска, которого вы ожидаете?


person jwtea    schedule 27.06.2018    source источник
comment
вы пробовали Алголию? algolia.com   -  person pseudoanime    schedule 27.06.2018
comment
github.com/adnanmayo/laravel-elastic, посмотрите это написанное мной   -  person Adnan Mumtaz    schedule 27.06.2018
comment
Спасибо, Анан, но это та же проблема, что и я. То есть есть запись с заголовком «Жидкие товары в соответствии с требованиями». Однако поиск этого с использованием "жидкости" ничего не возвращает.   -  person jwtea    schedule 27.06.2018
comment
Используя ES, вы можете добиться этого, играя со своим токенизатором и настройками сопоставления полей. Сначала посмотрите, как работает токенизатор NGram, а затем попробуйте создать поле с помощью Multiple поля с различными конфигурациями анализаторов / токенизаторов, это поможет вам лучше всего подойти к вашей проблеме.   -  person jordivador    schedule 27.06.2018
comment
Привет, @jordivador, спасибо, я начал это настраивать. Я не уверен, как заставить работать ngram должным образом. Например, event jack, event jon, event_jack, если вы ищете это с помощью event jack, я бы хотел, чтобы он отображался в порядке event jack, event_jack, event_jon   -  person jwtea    schedule 27.06.2018
comment
Да, но в этом случае вам также необходимо правильно настроить анализатор, например, если вам нужно, чтобы event_jack стал доступным для поиска по evevent или jack, которые вам нужно будет использовать, например. стандартный анализатор Без индексации ваших данных , вы можете попробовать разные анализаторы / токенизаторы и проверить, как ваши данные будут в индексе, используя / _ анализировать конечную точку   -  person jordivador    schedule 27.06.2018
comment
Да, я пробовал использовать стандартный анализатор для сопоставления event_ с event_jack, но он тоже не работает. В данный момент просто как бы колоть в темноте.   -  person jwtea    schedule 27.06.2018


Ответы (1)


TNTSearch имеет удобную функцию для достижения функциональности, аналогичной панели поиска в возвышенном тексте. Установив пакет, вы сразу же получите доступ к функции fuzzyMatchFromFile.

Давайте рассмотрим случай, когда у вас есть группа изображений, расположенных в одной папке, и вы хотите добавить функцию поиска.

Сначала вы должны сохранить список каталогов в файл. Это можно сделать с помощью простой команды, например:

find ./path/to/image/folder -type f -follow -print > image-files.txt

В image-files.txt каждое изображение будет в отдельной строке

Затем вы предоставите этот файл в качестве второго аргумента функции fuzzyMatchFromFile.

$query = "someword";
$path = "/path/to/image-files.txt";
$searchResults = fuzzyMatchFromFile($query, $path);

Массив $searchResults будет содержать путь к файлу вместе с оценкой

Если у вас есть файл с именем beautiful-image.png, вы также сможете найти его с помощью btfl-img.png.

Вышеупомянутое будет работать очень быстро до 100 тыс. Записей.

Алгоритм проверяет, существует ли общая подпоследовательность между запросом и именем файла, и если да, то вычисляет косинусное сходство между двумя векторами (имя файла и строки запроса преобразуются в вектор). Кроме того, если подстрока существует, она увеличивает оценку

person Nenad    schedule 29.06.2018