|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 66445.3568 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
24.12.2010, 17:39
|
#1
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
поиск на сфинксе
Имеются шопы на php+mysql со встроенной поисковой системой по продуктам. продуктов пусть будет 20-30к, трафу порядочно, серверными ресурсами не разбрасываемся.
Проблема в поиске, криво работает:
Если продукт называется "Canon 60 D", при поиске строки "Canon 60D" результат нулевой. Т.е. проблема в пробеле(а также точках, тире, слешах и тд). Причина ясна: поиск ищет обычным LIKE "%substring%"
Пути решения:
1. добавить в условие поиска все комбинации:.... productname LIKE "%substring%" AND productname LIKE "%sub string%" AND productname LIKE "%sub/string%" AND productname LIKE "%sub.string%" - но мне жалко ресурсы сервера БД
2. добавить новое поле, в котором перечислить все возможные комбинации для каждого продукта и по нему тоже искать: productname LIKE "%substring%" AND productsearchkeys LIKE "%substring%" AND - более щадящий режим по ресурсам, но геморно эти комбинации составлять
3. Отдать поиск на outsource. Сразу подумали про гуглопоиск, но нужен именно поиск по продуктам, а не по сайту, т.е. только по нужным полям, да и пока не хочу платить гуглу, поэтому ищу альтернативные решения, среди которых: http://sphinxsearch.com - знаю многие его прикручивают, но у меня вопрос, поможет ли он мне в решении моих проблем с поиском по кодам и абревиатурам и тд. Может есть у кого опыт? сам с ним не работал еще
|
|
|
24.12.2010, 18:18
|
#2
|
el patron
Регистрация: 17.04.2007
Сообщений: 486
Бабло: $2147483647
|
сфинкс мега вещь, поиск на нем летает
у сфинкса есть анализ строки поиска, т.е. может даже учитывать опечатки при поиске
__________________
15+ лет на гофаке, хранитель традиций, летописец, легенда
|
|
|
24.12.2010, 19:43
|
#3
|
Senior Member
Регистрация: 15.09.2010
Сообщений: 223
Бабло: $25140
|
Цитата:
Сообщение от chesser
Пути решения:
1. добавить в условие поиска все комбинации:.... productname LIKE "%substring%" AND productname LIKE "%sub string%" AND productname LIKE "%sub/string%" AND productname LIKE "%sub.string%" - но мне жалко ресурсы сервера БД
2. добавить новое поле, в котором перечислить все возможные комбинации для каждого продукта и по нему тоже искать: productname LIKE "%substring%" AND productsearchkeys LIKE "%substring%" AND - более щадящий режим по ресурсам, но геморно эти комбинации составлять
|
Твой пункт 2. можно немного с другой стороны рассматривать.
Рассуждая чисто теоретически.
Можно ввести меру string similarity (схожести строк). И сравнивать насколько запрос пользователя близок к названию продукта в базе данных по этому параметру.
В качестве меры схожести можно выбрать одно из расстояний редкатирования edit distance. Их несколько и какое больше подходит к коротким названиям товаров решать тебе.
Вот опенсорсная библиотека с описаними как вычисляют эти расстояния SimMetrics
Правда в этом случае, встает вопрос как эти расстояния заранее вычислить и поместить в базу данных, а не вычислять их каждый раз для товаров в БД (возможно есть общеизвестные подходы, но я в это не углублялся).
Есть отдельная группа алгоритмов специально направленная на определении схожести по предвычесленным параметрам, в основном это хеши. Это и алгоритм шинглов и simhash алгоритм.
Касаемо шинглов.По моему, на хабре была статья об использовании шинглов для сравнения коротких текстов(объявлений на сайте). В твоем случае для названий продуктов хеши шинглов можно вычислять используя последовательность символов а не слов.
|
|
|
24.12.2010, 19:46
|
#4
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845881
|
|
|
|
25.12.2010, 03:15
|
#5
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Цитата:
Сообщение от imgreen
|
это расширенное описание моего пункта 1 - тяжеловатое решение, к тому же пока непонятно как составлять эти шаблоны
MetaloIvastik, спасибо за конкретику, буду смотреть,
думаю, как раз сфинкс и реализует поиск предложенными тобой методами. Получается, что сфинкс - это мой 2 пункт, только удаленно от сайта, как отдельный независимый процесс...он же тоже как-то слова сравнивает, возможно эти алго и применяются
|
|
|
25.12.2010, 03:19
|
#6
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,230
Бабло: $247845881
|
Цитата:
Сообщение от chesser
это расширенное описание моего пункта 1 - тяжеловатое решение, к тому же пока непонятно как составлять эти шаблоны
MetaloIvastik, спасибо за конкретику, буду смотреть,
думаю, как раз сфинкс и реализует поиск предложенными тобой методами. Получается, что сфинкс - это мой 2 пункт, только удаленно от сайта, как отдельный независимый процесс...он же тоже как-то слова сравнивает, возможно эти алго и применяются
|
ну регекспы наверное как и везде
\s - пробельный символ
попробуй, может не все так плохо со скоростью, регексп то простейший получается
|
|
|
25.12.2010, 05:14
|
#8
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Цитата:
Сообщение от imgreen
ну регекспы наверное как и везде
\s - пробельный символ
попробуй, может не все так плохо со скоростью, регексп то простейший получается
|
смотри, у меня в базе есть продукт, product_name="canon 60 D"
сейчас выбирается примерно так:
WHERE product_name LIKE '%canon 60 D%' AND product_desc LIKE '%canon 60 D%' .... там еще несколько полей, но эти основные
Предположим посетитель вводит: "60D"
дальше мне как регексп правило составлять? 60\sD ? а откуда я знаю, что пробел именно в том месте? все варианты перебирать? 6\s0D ? помимо пробела может быть другие символы, например точки. К примеру:
в базе: 18-200 is, посетитель вводит: 18-200is - результат 0
в базе: f 80 exr, посетитель вводит: f80exr, f 80exr, f80 exr - пусто, уходит с сайта
в поиске: 24-70 2,8 - результат 1 продукт,
в поиске: 24-70 2.8 - результат 12 продуктов
как тут шаблоны составлять?
даже если проанализировать частые ошибки и таки придумать несколько шаблонов, и если следовать правилу 1 поле = 1 громоздкий шаблон - на выборках по неск. десятков к продуктов оно мне будет укладывать сервер, т.к. в шаблонах будут вилкард символы по любому, ну или сам факт использование регекспов - это уже значит работаем без индексов, простым перебором. Полнотекстовый поиск тут получше будет, но он от 4 символов ищет
|
|
|
25.12.2010, 05:37
|
#9
|
Senior Member
Регистрация: 01.05.2008
Сообщений: 556
Бабло: $65596
|
product_name="canon 60 D"
почему бы отсюда не убрать пробелы, символы табуляции
и не сравнивать с запросом, у которого тоже убраны пробелы и символы табуляции?)
__________________
сиг нет
|
|
|
25.12.2010, 05:48
|
#10
|
el patron
Регистрация: 17.04.2007
Сообщений: 486
Бабло: $2147483647
|
Минимальную длину полнотекстового поиска можно настроить в my.cnf
__________________
15+ лет на гофаке, хранитель традиций, летописец, легенда
|
|
|
|