Комментарии 11
Если я правильно понял задачу, в сфинксе можно создать индекс с этими вот перко-штуками и загонять в поиск название «изделия» по этому индексу. Я так делаю поиск «подобных»: товаров, статей, только в моем случае отдельный индекс не требуется.
И при этом поиск идёт не просто по тексту, а используется query язык? Интересно, а можно пример, т.к. я такой возможность в сфинксе не нашел и в доках собственно то же. Хотя вполне возможно, что просмотрел
«query язык» — это, я так понимаю, Extended query syntax, всякие OR, MAYBE, NOT?
Давайте разберем по порядку:
В доке сфинкса будет так:
Никаких условий, как видите, тут нет, но это не беда.
Дальше ищем изделие «Изучить Ruby on Rails максимально быстро»
Теперь вопрос: если в query нет никаких php, java, net найдется ли дока?
Допустим, в какой-нибудь залетной доке вы получите свой net. Для этого есть
Ну и еще, вы сами сказали, да и я согласен: у вас так или иначе будут ложные срабатывания.
У эластика есть percolator, у сфинкса лучше поиск по русскому. Эластика — хорошо работает с токенами, т.е. с тем, что не надо склонять, но можно рассматривать как порядок символов, поэтому будут шикарные результаты с английским текстом и никакой с русским. В одном проекте я так намучился с настройкой этих поисковиков, что в итоге оставил оба. Эластик работал с агрегационными запросами (фасетки), а сфинкс как «поисковик».
В вашем случае, мне кажется, конечный счет будет равный.
Давайте разберем по порядку:
"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. Особенно щекотливая тема похудения и наоборот. Группа набора весе (бодибилдинг) и похудения (сбросить вес) постоянно дают ложны срабатывания на сфинксе, а на эластике не будут.
В доке сфинкса будет так:
Нет, увы не так, например:
Вставать на лыжи
Вставать рано утром и программировать
Под запрос сфинкса будет ложное срабатывание, а под запрос эластика нет.
Перенести мой запрос на язык сфинкса можно только использовав Extended query syntax, а он учитываться при прямом поиске не будет.
Насчет русской морфологии, то скажем честно и сфинкс хромает, для этого у нас все русские слова проходят через PhpMorphy и мы вообще не используем русский stemming, хотя это и не относится к теме)
P.S. Особенно щекотливая тема похудения и наоборот. Группа набора весе (бодибилдинг) и похудения (сбросить вес) постоянно дают ложны срабатывания на сфинксе, а на эластике не будут.
Взяв небольшую группу запросов можно получить весьма точные результаты. Взяв еще одну и подкорректировав алгоритмы, можно получить весьма неплохие результаты. Взяв еще десять групп, легко получить кашу.
Поэтому вы правы в том, что исходите из своей задачи. Я вот уже второй день бьюсь над сфинксом, здесь потяну, тут хорошо, там потяну, здесь все плохо, но эластика совсем бы не справилась.
Поэтому вы правы в том, что исходите из своей задачи. Я вот уже второй день бьюсь над сфинксом, здесь потяну, тут хорошо, там потяну, здесь все плохо, но эластика совсем бы не справилась.
/cast summon shodan
Почему-то после выполнения второго запроса из примера (Создаем .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}%
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
ElasticSearch и поиск наоборот. Percolate API