Как стать автором
Обновить

Комментарии 110

Многие уже забыли что это такое, я думаю. А так — да, пишите, конечно, всегда интересно про поиск читать.
Писать о чем конкретно? :)
Просто «про поиск» я написать не смогу!
Интересно, почему забыли?
Чисто субъективно Lucene как-то больше на слуху в последнее время.
На хабре что-то давно ни того, ни того не слышно. Да и приятно использовать то, что написано нашим человеком.
Почему?

Я как раз выбираю движок для полнотекста. И думал именно про Ssphinx. Почему мне стоит подумать о Lucene?
У sphinx «монолитный» индекс
Эммм… Простите, в субботу сложные термины отказываются крутиться в моей голове :). Чем это хорошо/плохо?
Хорошо: очень быстрая индексация, более быстрый поиск[citation needed]
Плохо: нельзя динамически добавлять/удалять данные из индекса (читать: после каждого изменения базы, в теории, нужна полная переиндексация, но на практике небольшое отставание поисковой базы от MySQL почти всегда приемлемо).

Существует хак в виде инкрементального индекса. То есть фактически есть 2 индекса:
1) строится редко и по всей базе (i.e. раз в сутки)
2) строится часто по изменившейся части базы (i.e. раз в 5 минут)

Поиск, соответственно, происходит по обоим индексам одновременно.
Спасибо за объяснение!

А этот хак применителен, собственно, к Ssphinx'у?
да
А где его скачать? и попробовать? а можно информации по практической реализации инкрементального поиска на sphinx?
На самом деле, кстати, у Lucene тоже.
Каждый ихний сегмент это примерно такой же нашенский монолит.

Lucene автоматом управляет сегментами, регулярно их мержит где-то унутре.
И вообще скрывает потроха от пользователя.

Sphinx наоборот.
Пока не скрывает ничего, а местами зря (менее удобно).
Гм, а я увидев Sphinx подумал что речь идёт о sphinx.pocoo.org/ :)
Ну хоть не про CMU Sphinx!
Все уже знают, как легко и непринуждено делать подсказки и-или автокоррекцию слов?

Не надо статьи, вы хотя бы намекните куда копать.
sphinx-0.9.9-rc2/misc/suggest
Спасибо, не то чтобы «легко и непринужденно», но за час настроил :).
Один нюанс, в построении словаря все-таки стоит использовать функции mbstring, по крайней мере на русских базах — обычные strlen и особенно substr делают из utf-8 мусор.
еще бы автозамену пхп=>php и подобного транслита прикрутить
Засылайте патч :)
Ну что есть такой патч? было бы интересно
Автокоррекция слов? o_0 Было бы очень интересно почитать на эту тему!
да очень интересно, ждем
Ё! вы принесли самые лучшие новости за сегодня.
3 вопроса, без последнего :-)
вот их озвучивание было бы чудесным.
напишите ответы на вопросы которые Вы задаете в своем сообщении.
+1. было бы здорово услышать ответы на них :)
Ответы простые:
1. знают, но не все
2. нет, не все
3. не все
4. не все знают

Если серьёзно, то давно использую Sphinx — чрезвычайно хорошая вещь.
Почитать статьи на эту тему было бы интересно — вдруг чего упустил =)
А где его скачать? и попробовать? а можно информации по практической реализации инкрементального поиска на sphinx?
интересует возможность задания списка синонимов? хотя бы однословных.

например, хочется, чтобы starcraft, старкрафт, старик — воспринимались как одно и то же. то есть на запрос со словом старкрафт находились документы со starcraft

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

есть ли существующие средства для подобных вкусностей или нет? предвидятся? в какое место кода смотреть, чтобы (возможно) написать патч?
спасибо. буду смотреть )
Как интересно :) Спасибо )
Было б интересно прочитать про внутреннее устройство поиска, про использование тех или иных алгоритмов. Можно даже добавить каких-то «скучных» вещей про то как вообще нужно правильно обрабатывать большие массивы данных в памяти.

Про кластер тоже интересно почитать. Знаю что есть исходный код, но если уж сами предложили выбрать тему, то вот я предлагаю такие :-)
Тоже было бы интересно почитать про внутренности.
Все ждут live updates :)
очень ждут
О, интересная тема, я бы с удовольствием последил бы «по шагам»: как установить, как установить морфологию, как скрестить например с php, как пользоваться, попробовать сделать поиск на своём сайте по базе…
Неужели вам мана не хватает?
ман это одно, а хороший и толковый рассказ это более познавательно
А поиском не пробовали пользоваться? Я про настройку писал топик.
Спасибо, ваша дебютная статья очень познавательная neon.habrahabr.ru/blog/29195/

Ну а в целом, просто приятно порой читать этакие «разжевывания» из основ для «новичков», не все же здесь гуру во всех областях…
спасибо, как раз предстоит
Про «прикидываться MySQL» я бы почитал. Что это? Не backend к MySQL?
скорее всего имеется ввиду Sphinx storage engine
неа, это Spinx 0.9.9 эмулирует MySQL-сервер (используя как бэкенд реальный MySQL-сервер).
Так запросы к сфинксу можно писать на диалекте SQL.
аа, спасибо )
Объясните подробно, и доступно, чем Sphinx отличается от «MySQL fulltext search» на примере БД (id, title, description) со 100,000 записей например. Интересно также узнать и о качестве поиска по фразам, в сравнении Sphinx и «MySQL fulltext search». Спасибо!
О первом вопросе можно узнать из любой презентации с тематических конференций(highload, mysql conf, высокие нагрузки).
Лично у меня Sphinx в разы быстрее ищет, чем MySQL fulltext search.
Один только недостаток — долго перестраиваются индексы, но это совсем-совсем не критично.
Ищет не просто в разы, а в сотни раз, если не в тысячи раз быстрее (чем больше база, тем существеннее разница).
Индексы перестраивает не так уж и долго — минуту, ну может несколько от силы на 100000 записей потратит (к тому же там есть возможность не перестраивать, а обновить индексы). В любом случае работа в это время не останавливается.
А вот если заставить mysql перестроить заново fulltext индекс, то это вешалка просто (иногда приходилось, если, например таблица поломалась и её надо починить) — при больших размерах часами может переиндексировать и на всё это время таблицу лочит (в отличие от сфинкса). И ещё очень важно fulltext — это только MyISAM, а со сфинксом можно переползти на INNODB, а там в разы лучшая надежность, масштабируемость и прочие плюшки.
Спасибо за Ваш развернутый комментарий. Эта информация очень мне нужна сейчас. Меня пугает сама установка «Сфинкс», его нужно собирать для установки, т.е. не все так просто… для меня по крайней мере. Нашел на одном из российских торрентов отличную книгу: «High Performance MySQL» так там очень хорошие примеры приведены про использование «Сфинкс» на высоконагруженных сервисах типа mininova.org и тд. Может кого-то заинтересует. Книга на анг. языке.
Пока надо, да.
Когда-нибудь сделаем бинарные пакеты, пока не сделали.

Но сборка из сорсов и установка делается одной шелл командой все равно.
./configure --prefix=/home/sphinx && make install
И для Мака тоже так? Какой софт нужно иметь для этого? (я про компилятор).
На всех unix-like так.
Достаточно обычного gcc.

Говорят, на некоторых версиях MacOS геморрой с детектом версий iconv.
Лечится ./configure --without-iconv
Для меня это пока все так ново. Спасибо Вам за помощь!
ставится как-раз очень просто: для freebsd ставится из портов, для windows есть тоже собранный
У меня индексы из таблиц в MySQL (база весит около 10 Гб — много-много миллионов записей) перестраиваются примерно час.
Полнотекстовый поиск MySQL на объёмах на несколько порядков меньше (до перехода на Sphinx) просто вешался.
Ну и починка таблиц (пару раз было) — сами понимаете… Работа стоит, все ходят вокруг с недобрыми взглядами, а MySQL неспешно чинит табличку =)))
О, я не знал, что умеет уже прикидываться SQL-сервером, надо почитать.
Сейчас как раз новый проект беру, sphinx хотят использовать.
Вопрос: include в конфигах планируется когда-нибудь сделать?

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

#!/usr/bin/php в первую строчку, и оно заработает.
shebang syntax называется, говорят!
Вот блин: разочарован. Создал иссью в вашем трекере sphinxsearch.com/bugs/view.php?id=968

Насколько я понял — можно не надеяться и не ждать? Или надеяться все же можно? :)
При наличии #! я не вижу необходимости.
Вот вопрос.
Имеем индекс на 10 гигов. Строится он в течение 25 минут.
Время от времени база обновляется на 40-60% (за один раз).
Нужно переиндексировать.
Индексатор с запущенным одновременно поисковым демоном не пашет — демона нужно отключить и запускать переиндексацию.
Есть какие-то способы, чтобы не отключать демона и чтобы поиск все время работал?
По возможности, без параллельных индексов и подмены конфига.
indexer --rotate отлично пашет
Да, это я видел. Не помню, но какую-то ошибку индексер пишет при попытке использовать --rotate. Доберусь до поисковика, посмотрю.
как вариант — переиндексировать на другой машине. или можно делать на той же машине (если ресурсов хватает), но в другой файл индекса. потом копировать индекс в нужное место/перезапускать демона.

у меня вроде бы такая схема работает. не уверен, на сколько это грамотно с точки зрения философии сфинкса.

shodan?
Работает — не трожь!
расскажи как прикрутить сфинкс к MSsql 2008 и сравнительный аналих по скорости ответа (сфинкс vs родной Mssql)
Прикрутить вроде просто.
type=mysql либо type=odbc в конфиге + правильный odbc_dsn + остальное «как для MySQL»

Анализ сам не могу.
Тк. не умею пользоваться MS SQL :)
У нас в одном проекте на dotNet+MS SQL планируем использовать сфинкс.
программисты вроде API серьезно допилили.
Думаю, скоро поделятся.
Расскажите как поставить и проиндексить на существующих базах размеров в десятки гигов.
Нихрена я не знаю =)
Круто, давайте подробнее про все эти чудеса =)
Напишите про новый SetSelect
у меня так и не получилось использовать его в виде
SetSelect("*, @weight * ln(karma+2) as myweight");

А очень хочется. Проект уже работает.
Лично мне было бы интересно узнать про взаимодействие с PostgreSQL и сравнение sphinx с tsearch2.
Взаимодействие с постгри — на уровне SQL. Модулем, как для мускуля, собираться не умеет. Для постгри я предпочитаю именно tsearch2 — поскольку он встроенный, то для извращенных или оптимизированных за счет структуры базы (при помощи наследуемых таблиц например) селектов не надо строить извращенный индекс. По производительности — детально и на одинаковых наборах данных не исследовал, но tsearch вроде быстрее.
1. Понимает ли sphinx массивы в postgresql как sql_attr_multi или надо разворачивать их sql-запросом?
2. Хотелось бы мини-howto по SPH_MATCH_FULLSCAN.
1. Не понимает (и такую фичу пока никто не просил, вроде).
2. А про что конкретно?
2. Пример использования
1. Можно ли как-то узнать сколько значений отброшено по каждому конкретному атрибуту? Сильно бы помогло при отладке.

2. Значения атрибутов не показываются в логе, приходилось вести свой лог поверх стандартного.

Последний раз делал поиск несколько месяцев назад, поэтому возможно уже не актуально.
1. Из коробки нет, технически да, можно приписать лишнюю отладку.
2. Намеренно, полный дамп запроса получался довольно нечитаем. Но технически опять же можно приписать отладочную опцию.
Честно скажу:

пробовал я его поставить на windows, кажется получилося, а как поставить на VPS — совсем не знаю.
По мануалах ничего не понял. Личо я б с радостью почитал бы такую информацию.
В директории с исходниками:
CFLAGS=-O4 CXXFLAGS=-O4 ./configure --prefix=/дирректория/установки/сфинкса
make
make install

А далее идёте в каталог куда его ставили, в папку etc, там правите конфиг sphinx.conf, cd ../bin/ && ./indexer --all && ./searchd

Всё, Сфинкс запущен
Offtop:
А что за оптимизации -O4?
ну, в принципе эта та же -O3, просто у меня привычка указывать число больше 3х, мало ли когда версию gcc обновлю, а там ещё один уровень оптимизации добавился ;)
т.е. указание несуществующего уровня оптимизации, включает максимальный существующий…
shodan, расскажи про то как работает релевантность при выдаче.
Интерисует то, как правильнее вытащить запись «наверх» в поисковой выдаче.
да это очень реально нужная штука!

А еще очень интересно как можно модифицировать например первые 3 результата выдачи и показать свой сниппет+картинка+дополнительные ссылки
Я столкнулся с такой проблемой — есть несколько индексов с одинковой структурой аттрибутов, но пересекающимися идентификаторами. А искать нужно сразу в нескольких индексах, сфинкс же при совпадении айдишников из разных индексов оставляет только элемент из последнего указанного индекса — можно это как то обойти?
Мне кажется стоит пересмотреть структуру. Или сделать поиск по отдельным частям.
Если объединить индексы, то в выдаче sphinx'ом как вы будете различать какой id принадлежит к какой таблице?

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

Обойти можно, сделав SELECT id*10+XXX,… в запросе sql_query.
Где XXX это внутренний для приложения номер индекса.
Спасибо, об этом думали, но это как то ЧЖП (ЧерезЖоПу), решили поправить само хранение
Да нормальный привычный трюк.
В этом случае Sphinx IDs супротив document IDs разные просто, потому что неуникальность.

Ну бывает.
Можно кстати document ID от лени вообще в атрибут положить.
Все что перечислено в посте было бы интересно! Со своей стороны могу осветить некоторые вопросы интеграции с Ruby on Rails, если таких постов нет еще.
Было бы очень интересно почитать про автоподсказки и автоисправление слов.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, перечитал коменты с интересом. Хоть и 2 года прошло — но грабли похоже у всех одинаковые: непонимание, ошибки типовые.
Было бы интересно почитать про реализацию «живого поиска» с помощью Sphinx для PHP. (оправданность использования Sphinx-а для решения данного вопроса, сравнения с скоростью MySQL и т.д.)
Заранее благодарен за статью.
«Живой поиск» это что имеется в виду?
Работает примерно так: пользователь вводит несколько символов своего запроса и ему сразу предлагается несколько вариантов продолжения его запроса.
Например,
Живой поиск
Ну те. в любую базу данных импортируем лог запросов, и затем
SELECT * FROM query_log WHERE current_query LIKE 'жив%' ORDER BY freq LIMIT 10?
Хороший вариант, но подходит только для маленьких баз. MySQL LIKE будет медленно работать на больших базах (1 млн+ записей). Думаю, с помощью Sphinx можно сделать быстрее…
Нормально он будет работать, LIKE 'abc%' это довольно быстрая выборка по индексу.
Т.е. увеличение производительности за счет использования Sphinx вместо MySQL LIKE не будет?
Я не знаю.

В данном (данном) конкретном случае увеличения скорости в разы я бы не ожидал.

Но надо понимать, что LIKE 'abc%' супротив LIKE '%abc%' это две очень разные истории.

Первое — мгновенная выборка по индексу, второе — всегда полный перебор.

Здесь первый.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.