SlideShare a Scribd company logo
1 of 92
Про качественный поиск

     Андрей Аксенов,
   Sphinx Technologies Inc
PARENTAL WARNING
  ADULT CONTENT
[0/4] Зачем это все?
Зачем этот доклад?
• Скорости растут => скорости… неважны
  • Ну, в жизни, а не синтетических бенчмарках
• Людей-посетителей приучают к “плохому”
  • Google, Yandex, итп
• Из коробки получается не очень
• Из коробки не может получаться, надо по-разному тюнить
• Ну и это просто интересная в целом тема!
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
• …за год успел вырасти!
[1/4] Что такое
релевантность
Релевантность, это –
• Такой спец-термин из поиска
• Такое большое человеческое заблуждение
• Щаз будем заменять одно заблуждение набором
  других!
• Возникает т.н. «релевантность» ровно в тот
  момент…
…когда кто-нибудь…
…где-нибудь…
…что-нибудь…
…ищет и, увы (*),
   находит
…ищет и, увы (*),
     находит
*) – самый быстрый запрос – пустой!!!
…и приходится
ранжировать
Один Случайный Запрос
[battleship]
Правила игры
“Морской бой”?
[battle sheep]?
Внезапно, шокирующая
      истина!!!
“Нет никакой ложки”
И никакой “релевантности” –
         тоже нет
“Красота – в глазах
  смотрящего.”
Но ранжировать таки надо!!!
Как же это таки устроено?
Документ
"The time has come," the Walrus said,
"To talk of many things:
Of shoes, and ships, and sealing-wax,
Of cabbages, and kings,
And why the sea is boiling hot-
And whether pigs have wings."
Запрос
"The time has come," the Walrus said,
"To talk of many things:
Of shoes, and ships, and sealing-wax,
Of cabbages, and kings,
And why the sea is boiling hot-
And whether pigs have wings."
1 (один) фактор, BM25
Факторов больше
PageRank                DomainAge   DocLength

IsSpam    IsPorn               HITSAuthority
NumIncomingLinks                 NumOutgoingLinks
 WhateverOtherFactor1     WhateverOtherFactor2
И даже еще больше
(btw, фактор == сигнал)
Что и зачем, таки, считаем?
Целевая функция
• На входе – куча чиселок, факторов
• На выходе – одно число
• Rel = Rel(f1, f2, …, f200, …): RNumFactors  R

• Ш.И.: но конкретные числа… неважны!
• Ш.И.: важен… порядок документов
Метрики качества
• Все начинается с оценок
    • Теплых, ламповых, человеческих
•   Оценивается всегда пара запрос+документ
•   Бинарные (0/1), “просто” числа, и т.п.
•   Для простоты, пусть будут тупо бинарные
•   Bсе это вводится, впрочем, чтобы как-то сравнивать
    разные отклики
Пример отклика 1
1. Sphinx | Open Source Search Server
2. Sphinx - Wikipedia, the free encyclopedia
3. Great Sphinx of Giza - Wikipedia, the free encyclopedia
4. Overview - Sphinx 1.1.2 documentation
Пример отклика 2
1. Great Sphinx of Giza - Wikipedia, the free encyclopedia
2. Sphinx - Wikipedia, the free encyclopedia
3. Sphinx | Open Source Search Server
4. Overview - Sphinx 1.1.2 documentation
Пример отклика 3
1. Sphinx - Wikipedia, the free encyclopedia
2. Sphinx | Open Source Search Server
3. Overview - Sphinx 1.1.2 documentation
4. Great Sphinx of Giza - Wikipedia, the free encyclopedia
Метрики качества
• Без учета порядка – Precision, Recall
• С учетом порядка – Average Precision, AP
   • Или DCG, BPREF, pFound, и т.п.
• Усредняем кучу запросов – Mean AP, MAP
   • Или средний DCG, BPREF, pFound, и т.п.
• Все, теперь это наша заветная цель
• Чем больше, например MAP
       => тем больше Среднее Счастье Пользователя 
Извилистый путь релевантности
• Есть мега-функция Rel()
• Есть куча документов
• Есть куча запросов
• Есть куча пользовательских оценок
• Считаем Rel (по функции и факторам)
      => генерируем отклики (сортировка по Rel)
              => считаем MAP, DCG итп (по оценкам)
                     => усредняем и сравниваем
Rel(D,Q) = Rel(f1, f2, …, f200, …)
Ш.И.: аналитически –
   невозможно
Поэтому – машинное
    обучение…
…считай – регрессия,
на вагоне стероидов.
Что подвергается “регрессии”?
• Оптимизируем – MAP, например
• Известны – факторы, оценки
• Найти – вид (!), коэффициенты Rel()
     • Rel = a1f1 + a2f2 + … ?
     • Rel = a1exp(f1) + 1/(a2-f2) + … ?
     • …
• См. аналитически невозможно, ага
Засада!!! Вид идеальной
 функции – неизвестен
Ш.И. – поэтому, вид функции
      типично берем...
Тупо кусочно-линейный!!!
Я ненавижу
математику!
Зачем мне этот
  хардкор?!
Метрикам – да, ML – тоже да!!!
• Если хочется качества, знать таки нужно
• Проверять качество вручную нереально
  • Быстрая, но болезненная смерть
• Подгонять формулы вручную таки можно!
  • Мелкие уж точно, да и Google врет
• Но почему не опробовать готовый мат/статпакет?
“Итоги подведем” (с) Гамлет
• Релевантность в мире веб-поиска?
• Все начинается с оценок, и все оценки субъективные
• Оценок и факторов на входе УУУ МНОГО

• Рукой уже никак, обязательно машинное обучение
• Обучение == “умная” “регрессия”, условно

• На выходе – ну, какая-то мега-функция
• Которая – максимизирует Метрику Счастья
“Итоги подведем” (с) Гамлет
• Релевантность в мире веб-поиска для простых людей?
• Все начинается с оценок, и все оценки субъективные
• Оценок и факторов на входе УУУ МНОГО МАЛО

• Формулу рукой еще можно, но можно и машинное обучение
• А вот проверять метрики сразу автоматом, но это просто!

• На выходе – ну, какая-то мега-функция
• Которая – максимизирует Метрику Счастья
[2/4] Sphinx,
  ранкеры
Или…
• Как все (теперь) “хорошо” в веб-поиске
• Как все (пока еще) “плохо” в менее
  затейливых движках
  • особенно опен-сорсных 
“Не было ни единого разрыва!”
Все остальные       Веб-поиск
1-10… факторов      100-1000+ факторов
0 оценок?           1-10M+ оценок
Ad-hoc функции      Специально
(см. левая пятка)   обученные функции
                    (см. маш. обучение)
Не все так плохо!
•   Вы не Google!
•   А, скажем, сайт про запчасти для Белазов
•   Незначительно поменьше данных
•   Чуть пореже запросы
•   Отклики потоньше
•   Ad-hoc может приемлемо сработать
Vanilla (!) Lucene @ ROMIP
Как это делает Sphinx
• Ранкер: какая-то функция ранжирования
• Только харкод: заранее встроенная в Sphinx
• Можно выбирать на лету, 1 строкой
  • $client->SetRankingMode(SPH_RANK_BM25)
  • SELECT … OPTION ranker=bm25
Осторожно, скользкая ступенька!
• $client->SetRankingMode(SPH_RANK_BM25)
  • Через API только в режиме extended
  • $client->SetMatchMode(SPH_MATCH_EXTENDED)
Кого хотеть?
• BM25 – грубо говоря, аналог Lucene
• PROXIMITY_BM25 – бустит (под)фразы
  • Но однако не смотрит на частоты слов в подфразе
• SPH04 – еще бустит начало поля, точное совпадения поля

• Других встроенных ”про качество” пока нет
• И, возможно, уже (почти) не будет…
[3/4] Sphinx,
expression ranker
Expression ranker, 2.0.2+

SELECT *, WEIGHT() FROM myindex
WHERE MATCH('hello world')
OPTION ranker=expr('sum(lcs*user_weight) *
  1000+bm25')
Expression ranker, 2.0.2+

SELECT *, WEIGHT() FROM myindex
WHERE MATCH('hello world')
OPTION ranker=expr('sum(lcs*user_weight) *
  1000+bm25')
Да, настолько просто!
• Пользоваться – вот так, буквально
  • Через API тоже можно
• Дефолтная формула proximity_bm25
  – вот такая, буквально
  • sum(lcs*user_weight) * 1000 + bm25
• Как я раньше и говорил, Целых Два Фактора!!!
Просто было в учении
• Кучка новых факторов
• Document Level:
   • bm25, max_lcs, query_word_count, doc_word_count
• Field Level:
   • lcs, user_weight, hit_count, word_count, tf_idf, min_hit_pos,
     min_best_span_pos, exact_hit
• Планируются (и нетяжело) делать еще – звоните
Просто было в учении
• Field level обязательно агрегировать
    • Функция пока только SUM, но звоните
•   Доступны все атрибуты документа
•   Доступны все встроенные математические функции
•   Кажется, доступны UDF (не проверял)
•   Работает подозрительно быстро
Наш самый сложный ранкер
• SPH_RANK_SPH04 =
  sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*
  user_weight)*1000+bm25

• Уверен, вы можете лучше :)
• Тем более, что теперь все знаете всё :)
[4/4] “Низколетящие
      фрукты”...
[4/4] …или, что еще
  можно сделать
Качество != ранжирование
•   Еще опечатки
•   Еще “занудность” поиска
•   Еще морфология
•   Еще синонимы, расширение запросов
•   Еще номера моделей, и т.п. вертикали
•   Еще анализ запросов (натягивание на фильтры)
Ш.И.: уже (давно) МОЖНО
Как бороться “легко”?
• Опечатки? sphinx/misc/suggest/
• Занудность? Оператор кворума
• Анализ запросов? regexps, SHOW KEYWORDS
Как бороться “тяжело”?
• Морфология, синонимы – wordforms, stemmer,
  expansions, index_exact_words
  • Местами неудобно, но таки можно
• Номера моделей – препроцессинг, и-или танцы с
  blend_chars, stopword_step, и т.п.
  • Нужен ряд ручных правил под предметку, не избежать
Качество != ранжирование
•   Еще опечатки
•   Еще “занудность” поиска
•   Еще морфология
•   Еще синонимы, расширение запросов
•   Еще номера моделей, и т.п. вертикали
•   Еще анализ запросов (натягивание на фильтры)
Итого
Итого
•   Вот как устроена релевантность – вообще
•   Вот что уже встроено – конкретно в Сфинкс
•   Вот как теперь бороть релевантность – у нас
•   Вот какие еще есть беды с качеством – вообще
•   Вот как можно их тоже забарывать – в целом
•   Почему ваш поиск до сих пор… так себе?!
Вопросы?
shodan@sphinxsearch.com

More Related Content

What's hot

13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
IT-Portfolio
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo
 

What's hot (11)

13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
 
Юрий Цыганенко
Юрий ЦыганенкоЮрий Цыганенко
Юрий Цыганенко
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
неприятная правда про язык go
неприятная правда про язык goнеприятная правда про язык go
неприятная правда про язык go
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testing
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Tk conf daniel-podolsky-sqlvsnosql
Tk conf daniel-podolsky-sqlvsnosqlTk conf daniel-podolsky-sqlvsnosql
Tk conf daniel-podolsky-sqlvsnosql
 
Data mining for nmap acceleration
Data mining for nmap accelerationData mining for nmap acceleration
Data mining for nmap acceleration
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 

Similar to Про качественный поиск

Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
Andrew Aksyonoff
 
Как устроен поиск (Андрей Аксёнов)
Как устроен поиск (Андрей Аксёнов)Как устроен поиск (Андрей Аксёнов)
Как устроен поиск (Андрей Аксёнов)
Ontico
 
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
Крадущийся сервер, затаившийся диод (Андрей Аксенов)Крадущийся сервер, затаившийся диод (Андрей Аксенов)
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
Ontico
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диод
Andrew Aksyonoff
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04
Computer Science Club
 

Similar to Про качественный поиск (20)

Юрий Цыганенко, QA как услуга
Юрий Цыганенко, QA как услугаЮрий Цыганенко, QA как услуга
Юрий Цыганенко, QA как услуга
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
 
Как устроен поиск (Андрей Аксёнов)
Как устроен поиск (Андрей Аксёнов)Как устроен поиск (Андрей Аксёнов)
Как устроен поиск (Андрей Аксёнов)
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенко
 
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
 
20131112федорроманенко
20131112федорроманенко20131112федорроманенко
20131112федорроманенко
 
BDD
BDDBDD
BDD
 
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
 
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
Крадущийся сервер, затаившийся диод (Андрей Аксенов)Крадущийся сервер, затаившийся диод (Андрей Аксенов)
Крадущийся сервер, затаившийся диод (Андрей Аксенов)
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диод
 
Владимир Лучанинов. Сделай сам анализатор SERP
Владимир Лучанинов. Сделай сам анализатор SERPВладимир Лучанинов. Сделай сам анализатор SERP
Владимир Лучанинов. Сделай сам анализатор SERP
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
 
Devconf-2014: Ноотропы для BigData
Devconf-2014: Ноотропы для BigDataDevconf-2014: Ноотропы для BigData
Devconf-2014: Ноотропы для BigData
 
Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...
 
Оценка сроков IT проектов
Оценка сроков IT проектовОценка сроков IT проектов
Оценка сроков IT проектов
 
Codeception UATestingDays
Codeception UATestingDaysCodeception UATestingDays
Codeception UATestingDays
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 

Про качественный поиск

  • 1. Про качественный поиск Андрей Аксенов, Sphinx Technologies Inc
  • 2. PARENTAL WARNING ADULT CONTENT
  • 4. Зачем этот доклад? • Скорости растут => скорости… неважны • Ну, в жизни, а не синтетических бенчмарках • Людей-посетителей приучают к “плохому” • Google, Yandex, итп • Из коробки получается не очень • Из коробки не может получаться, надо по-разному тюнить • Ну и это просто интересная в целом тема!
  • 5. Почему этот доклад? • Коротенький блиц-доклад с РИТ ‘2011…
  • 6. Почему этот доклад? • Коротенький блиц-доклад с РИТ ‘2011…
  • 7. Почему этот доклад? • Коротенький блиц-доклад с РИТ ‘2011… • …за год успел вырасти!
  • 9. Релевантность, это – • Такой спец-термин из поиска • Такое большое человеческое заблуждение • Щаз будем заменять одно заблуждение набором других! • Возникает т.н. «релевантность» ровно в тот момент…
  • 13. …ищет и, увы (*), находит
  • 14.
  • 15. …ищет и, увы (*), находит *) – самый быстрый запрос – пустой!!!
  • 17.
  • 20.
  • 21.
  • 23.
  • 25.
  • 27.
  • 29.
  • 31. “Красота – в глазах смотрящего.”
  • 33. Как же это таки устроено?
  • 34. Документ "The time has come," the Walrus said, "To talk of many things: Of shoes, and ships, and sealing-wax, Of cabbages, and kings, And why the sea is boiling hot- And whether pigs have wings."
  • 35. Запрос "The time has come," the Walrus said, "To talk of many things: Of shoes, and ships, and sealing-wax, Of cabbages, and kings, And why the sea is boiling hot- And whether pigs have wings."
  • 37. Факторов больше PageRank DomainAge DocLength IsSpam IsPorn HITSAuthority NumIncomingLinks NumOutgoingLinks WhateverOtherFactor1 WhateverOtherFactor2
  • 38. И даже еще больше
  • 39. (btw, фактор == сигнал)
  • 40. Что и зачем, таки, считаем?
  • 41. Целевая функция • На входе – куча чиселок, факторов • На выходе – одно число • Rel = Rel(f1, f2, …, f200, …): RNumFactors  R • Ш.И.: но конкретные числа… неважны! • Ш.И.: важен… порядок документов
  • 42. Метрики качества • Все начинается с оценок • Теплых, ламповых, человеческих • Оценивается всегда пара запрос+документ • Бинарные (0/1), “просто” числа, и т.п. • Для простоты, пусть будут тупо бинарные • Bсе это вводится, впрочем, чтобы как-то сравнивать разные отклики
  • 43. Пример отклика 1 1. Sphinx | Open Source Search Server 2. Sphinx - Wikipedia, the free encyclopedia 3. Great Sphinx of Giza - Wikipedia, the free encyclopedia 4. Overview - Sphinx 1.1.2 documentation
  • 44. Пример отклика 2 1. Great Sphinx of Giza - Wikipedia, the free encyclopedia 2. Sphinx - Wikipedia, the free encyclopedia 3. Sphinx | Open Source Search Server 4. Overview - Sphinx 1.1.2 documentation
  • 45. Пример отклика 3 1. Sphinx - Wikipedia, the free encyclopedia 2. Sphinx | Open Source Search Server 3. Overview - Sphinx 1.1.2 documentation 4. Great Sphinx of Giza - Wikipedia, the free encyclopedia
  • 46. Метрики качества • Без учета порядка – Precision, Recall • С учетом порядка – Average Precision, AP • Или DCG, BPREF, pFound, и т.п. • Усредняем кучу запросов – Mean AP, MAP • Или средний DCG, BPREF, pFound, и т.п. • Все, теперь это наша заветная цель • Чем больше, например MAP => тем больше Среднее Счастье Пользователя 
  • 47. Извилистый путь релевантности • Есть мега-функция Rel() • Есть куча документов • Есть куча запросов • Есть куча пользовательских оценок • Считаем Rel (по функции и факторам) => генерируем отклики (сортировка по Rel) => считаем MAP, DCG итп (по оценкам) => усредняем и сравниваем
  • 48. Rel(D,Q) = Rel(f1, f2, …, f200, …)
  • 49. Ш.И.: аналитически – невозможно
  • 50.
  • 51. Поэтому – машинное обучение…
  • 52.
  • 53. …считай – регрессия, на вагоне стероидов.
  • 54.
  • 55. Что подвергается “регрессии”? • Оптимизируем – MAP, например • Известны – факторы, оценки • Найти – вид (!), коэффициенты Rel() • Rel = a1f1 + a2f2 + … ? • Rel = a1exp(f1) + 1/(a2-f2) + … ? • … • См. аналитически невозможно, ага
  • 56. Засада!!! Вид идеальной функции – неизвестен
  • 57.
  • 58. Ш.И. – поэтому, вид функции типично берем...
  • 61.
  • 62. Зачем мне этот хардкор?!
  • 63. Метрикам – да, ML – тоже да!!! • Если хочется качества, знать таки нужно • Проверять качество вручную нереально • Быстрая, но болезненная смерть • Подгонять формулы вручную таки можно! • Мелкие уж точно, да и Google врет • Но почему не опробовать готовый мат/статпакет?
  • 64. “Итоги подведем” (с) Гамлет • Релевантность в мире веб-поиска? • Все начинается с оценок, и все оценки субъективные • Оценок и факторов на входе УУУ МНОГО • Рукой уже никак, обязательно машинное обучение • Обучение == “умная” “регрессия”, условно • На выходе – ну, какая-то мега-функция • Которая – максимизирует Метрику Счастья
  • 65. “Итоги подведем” (с) Гамлет • Релевантность в мире веб-поиска для простых людей? • Все начинается с оценок, и все оценки субъективные • Оценок и факторов на входе УУУ МНОГО МАЛО • Формулу рукой еще можно, но можно и машинное обучение • А вот проверять метрики сразу автоматом, но это просто! • На выходе – ну, какая-то мега-функция • Которая – максимизирует Метрику Счастья
  • 66. [2/4] Sphinx, ранкеры
  • 67. Или… • Как все (теперь) “хорошо” в веб-поиске • Как все (пока еще) “плохо” в менее затейливых движках • особенно опен-сорсных 
  • 68.
  • 69. “Не было ни единого разрыва!” Все остальные Веб-поиск 1-10… факторов 100-1000+ факторов 0 оценок? 1-10M+ оценок Ad-hoc функции Специально (см. левая пятка) обученные функции (см. маш. обучение)
  • 70. Не все так плохо! • Вы не Google! • А, скажем, сайт про запчасти для Белазов • Незначительно поменьше данных • Чуть пореже запросы • Отклики потоньше • Ad-hoc может приемлемо сработать
  • 71.
  • 73. Как это делает Sphinx • Ранкер: какая-то функция ранжирования • Только харкод: заранее встроенная в Sphinx • Можно выбирать на лету, 1 строкой • $client->SetRankingMode(SPH_RANK_BM25) • SELECT … OPTION ranker=bm25
  • 74. Осторожно, скользкая ступенька! • $client->SetRankingMode(SPH_RANK_BM25) • Через API только в режиме extended • $client->SetMatchMode(SPH_MATCH_EXTENDED)
  • 75. Кого хотеть? • BM25 – грубо говоря, аналог Lucene • PROXIMITY_BM25 – бустит (под)фразы • Но однако не смотрит на частоты слов в подфразе • SPH04 – еще бустит начало поля, точное совпадения поля • Других встроенных ”про качество” пока нет • И, возможно, уже (почти) не будет…
  • 77. Expression ranker, 2.0.2+ SELECT *, WEIGHT() FROM myindex WHERE MATCH('hello world') OPTION ranker=expr('sum(lcs*user_weight) * 1000+bm25')
  • 78. Expression ranker, 2.0.2+ SELECT *, WEIGHT() FROM myindex WHERE MATCH('hello world') OPTION ranker=expr('sum(lcs*user_weight) * 1000+bm25')
  • 79. Да, настолько просто! • Пользоваться – вот так, буквально • Через API тоже можно • Дефолтная формула proximity_bm25 – вот такая, буквально • sum(lcs*user_weight) * 1000 + bm25 • Как я раньше и говорил, Целых Два Фактора!!!
  • 80. Просто было в учении • Кучка новых факторов • Document Level: • bm25, max_lcs, query_word_count, doc_word_count • Field Level: • lcs, user_weight, hit_count, word_count, tf_idf, min_hit_pos, min_best_span_pos, exact_hit • Планируются (и нетяжело) делать еще – звоните
  • 81. Просто было в учении • Field level обязательно агрегировать • Функция пока только SUM, но звоните • Доступны все атрибуты документа • Доступны все встроенные математические функции • Кажется, доступны UDF (не проверял) • Работает подозрительно быстро
  • 82. Наш самый сложный ранкер • SPH_RANK_SPH04 = sum((4*lcs+2*(min_hit_pos==1)+exact_hit)* user_weight)*1000+bm25 • Уверен, вы можете лучше :) • Тем более, что теперь все знаете всё :)
  • 83. [4/4] “Низколетящие фрукты”...
  • 84. [4/4] …или, что еще можно сделать
  • 85. Качество != ранжирование • Еще опечатки • Еще “занудность” поиска • Еще морфология • Еще синонимы, расширение запросов • Еще номера моделей, и т.п. вертикали • Еще анализ запросов (натягивание на фильтры)
  • 87. Как бороться “легко”? • Опечатки? sphinx/misc/suggest/ • Занудность? Оператор кворума • Анализ запросов? regexps, SHOW KEYWORDS
  • 88. Как бороться “тяжело”? • Морфология, синонимы – wordforms, stemmer, expansions, index_exact_words • Местами неудобно, но таки можно • Номера моделей – препроцессинг, и-или танцы с blend_chars, stopword_step, и т.п. • Нужен ряд ручных правил под предметку, не избежать
  • 89. Качество != ранжирование • Еще опечатки • Еще “занудность” поиска • Еще морфология • Еще синонимы, расширение запросов • Еще номера моделей, и т.п. вертикали • Еще анализ запросов (натягивание на фильтры)
  • 91. Итого • Вот как устроена релевантность – вообще • Вот что уже встроено – конкретно в Сфинкс • Вот как теперь бороть релевантность – у нас • Вот какие еще есть беды с качеством – вообще • Вот как можно их тоже забарывать – в целом • Почему ваш поиск до сих пор… так себе?!