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

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

Если я правильно понял задачу, в сфинксе можно создать индекс с этими вот перко-штуками и загонять в поиск название «изделия» по этому индексу. Я так делаю поиск «подобных»: товаров, статей, только в моем случае отдельный индекс не требуется.
И при этом поиск идёт не просто по тексту, а используется query язык? Интересно, а можно пример, т.к. я такой возможность в сфинксе не нашел и в доках собственно то же. Хотя вполне возможно, что просмотрел
«query язык» — это, я так понимаю, Extended query syntax, всякие OR, MAYBE, NOT?
Давайте разберем по порядку:
"Ruby | RoR | \"Ruby on Rails\" | \"программирование Ruby\"~4 | \"вставать на рельсы\" -php -java -net",

В доке сфинкса будет так:
'Ruby RoR Ruby on Rails программирование Ruby  вставать на рельсы',

Никаких условий, как видите, тут нет, но это не беда.
Дальше ищем изделие «Изучить Ruby on Rails максимально быстро»
query = u'Изучить Ruby on Rails максимально быстро'
s.SetMatchMode(sp.SPH_MATCH_EXTENDED2)
s.SetRankingMode(sp.SPH_RANK_SPH04)
s.SetFilterRange('@weight', 0, 40, True) # Об этом чуть ниже
results = s.Query(query, index='keywords')

Теперь вопрос: если в query нет никаких php, java, net найдется ли дока?
Допустим, в какой-нибудь залетной доке вы получите свой net. Для этого есть s.SetFilterRange('@weight', 0, 40, True) — это фильтр веса, можно обрезать всякие мало-мальские совпадения. Т.е. все зависит от того, как вы это настроите. В эластике он тоже есть, но мой опыт говорит, что он не работает как ожидается.
Ну и еще, вы сами сказали, да и я согласен: у вас так или иначе будут ложные срабатывания.
У эластика есть percolator, у сфинкса лучше поиск по русскому. Эластика — хорошо работает с токенами, т.е. с тем, что не надо склонять, но можно рассматривать как порядок символов, поэтому будут шикарные результаты с английским текстом и никакой с русским. В одном проекте я так намучился с настройкой этих поисковиков, что в итоге оставил оба. Эластик работал с агрегационными запросами (фасетки), а сфинкс как «поисковик».
В вашем случае, мне кажется, конечный счет будет равный.
В целом согласен, хотя есть нюансы:
В доке сфинкса будет так:

Нет, увы не так, например:
Вставать на лыжи
Вставать рано утром и программировать

Под запрос сфинкса будет ложное срабатывание, а под запрос эластика нет.

Перенести мой запрос на язык сфинкса можно только использовав Extended query syntax, а он учитываться при прямом поиске не будет.

Насчет русской морфологии, то скажем честно и сфинкс хромает, для этого у нас все русские слова проходят через PhpMorphy и мы вообще не используем русский stemming, хотя это и не относится к теме)

P.S. Особенно щекотливая тема похудения и наоборот. Группа набора весе (бодибилдинг) и похудения (сбросить вес) постоянно дают ложны срабатывания на сфинксе, а на эластике не будут.
Взяв небольшую группу запросов можно получить весьма точные результаты. Взяв еще одну и подкорректировав алгоритмы, можно получить весьма неплохие результаты. Взяв еще десять групп, легко получить кашу.
Поэтому вы правы в том, что исходите из своей задачи. Я вот уже второй день бьюсь над сфинксом, здесь потяну, тут хорошо, там потяну, здесь все плохо, но эластика совсем бы не справилась.
summon сработал, а вопрос-то в чем? :)

ну да, и percolate тоже у нас пока нету — вероятно, через некоторое время будет
Здорово, что эластик набирает популярность.
Я делал проект, где percolate — основняя фича. Исходники открыты.
Буду рад пообщаться.
Читал вашу статью, жаль что вы там не рассмотрели подробно техническую часть, мне бы очень помогло, пришлось ковыряться самостоятельно)
Как вы решаете вопрос с нагрузками, я так понимаю, что у вас уже довольно много percolator индексов? Интересно ваш опыт в этом плане.
Почему-то после выполнения второго запроса из примера (Создаем .percolator) вываливается ошибка

{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse"}],"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":{"type":"json_parse_exception","reason":"Unexpected character ('}' (code 125)): was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name\n at [Source: org.elasticsearch.common.io.stream.InputStreamStreamInput@6c53773d; line: 12, column: 2]"}},"status":400}%
Оу, в конце точка с запятой

   "language" : "ru",
}'


btw спасибо за статью. Знакомлюсь :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий