Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.6150
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 24.12.2010, 17:39   #1
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $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 - знаю многие его прикручивают, но у меня вопрос, поможет ли он мне в решении моих проблем с поиском по кодам и абревиатурам и тд. Может есть у кого опыт? сам с ним не работал еще
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 24.12.2010, 18:18   #2
proc3nt
el patron
 
Аватар для proc3nt
 
Регистрация: 17.04.2007
Сообщений: 457
Бабло: $2147483647
Отправить сообщение для proc3nt с помощью ICQ
По умолчанию

сфинкс мега вещь, поиск на нем летает
у сфинкса есть анализ строки поиска, т.е. может даже учитывать опечатки при поиске
__________________
10 лет на гофаке, хранитель традиций, летописец, легенда
proc3nt вне форума  
Старый 24.12.2010, 19:43   #3
MetaloIvastik
Юниор
 
Регистрация: 15.09.2010
Сообщений: 17
Бабло: $4070
По умолчанию

Цитата:
Сообщение от 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 алгоритм.

Касаемо шинглов.По моему, на хабре была статья об использовании шинглов для сравнения коротких текстов(объявлений на сайте). В твоем случае для названий продуктов хеши шинглов можно вычислять используя последовательность символов а не слов.
MetaloIvastik вне форума  
Старый 24.12.2010, 19:46   #4
imgreen
Lion King
 
Аватар для imgreen
 
Регистрация: 15.11.2008
Сообщений: 12,090
Бабло: $247698096
По умолчанию

http://www.mysql.ru/docs/man/Pattern_matching.html
__________________
ДетскиеДомики.ру - забота о детях с особыми нуждами.
imgreen вне форума  
Старый 25.12.2010, 03:15   #5
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от imgreen Посмотреть сообщение
это расширенное описание моего пункта 1 - тяжеловатое решение, к тому же пока непонятно как составлять эти шаблоны

MetaloIvastik, спасибо за конкретику, буду смотреть,
думаю, как раз сфинкс и реализует поиск предложенными тобой методами. Получается, что сфинкс - это мой 2 пункт, только удаленно от сайта, как отдельный независимый процесс...он же тоже как-то слова сравнивает, возможно эти алго и применяются
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 25.12.2010, 03:19   #6
imgreen
Lion King
 
Аватар для imgreen
 
Регистрация: 15.11.2008
Сообщений: 12,090
Бабло: $247698096
По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
это расширенное описание моего пункта 1 - тяжеловатое решение, к тому же пока непонятно как составлять эти шаблоны

MetaloIvastik, спасибо за конкретику, буду смотреть,
думаю, как раз сфинкс и реализует поиск предложенными тобой методами. Получается, что сфинкс - это мой 2 пункт, только удаленно от сайта, как отдельный независимый процесс...он же тоже как-то слова сравнивает, возможно эти алго и применяются
ну регекспы наверное как и везде
\s - пробельный символ
попробуй, может не все так плохо со скоростью, регексп то простейший получается
__________________
ДетскиеДомики.ру - забота о детях с особыми нуждами.
imgreen вне форума  
Старый 25.12.2010, 03:36   #7
f4llou7
Member
 
Регистрация: 20.07.2008
Сообщений: 91
Бабло: $15712
По умолчанию

вообщем для таких целей полнотекстовый поиск в мускуле есть
http://www.mysql.ru/docs/man/Fulltext_Search.html
f4llou7 вне форума  
Старый 25.12.2010, 05:14   #8
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $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 символов ищет
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 25.12.2010, 05:37   #9
EmmetBraun
Senior Member
 
Аватар для EmmetBraun
 
Регистрация: 01.05.2008
Сообщений: 546
Бабло: $61706
По умолчанию

product_name="canon 60 D"

почему бы отсюда не убрать пробелы, символы табуляции

и не сравнивать с запросом, у которого тоже убраны пробелы и символы табуляции?)
__________________
сиг нет
EmmetBraun вне форума  
Старый 25.12.2010, 05:48   #10
proc3nt
el patron
 
Аватар для proc3nt
 
Регистрация: 17.04.2007
Сообщений: 457
Бабло: $2147483647
Отправить сообщение для proc3nt с помощью ICQ
По умолчанию

Минимальную длину полнотекстового поиска можно настроить в my.cnf
__________________
10 лет на гофаке, хранитель традиций, летописец, легенда
proc3nt вне форума  
Закрытая тема



Опции темы
Опции просмотра