В докладе рассматриваются особенности системы параметрического поиска, построенной на базе опенсорс-плаформы Apache Solr. Речь пойдёт о проблемах производительности такой системы и некоторых методах их решения — в том числе о применении различных способов построения запросов для уменьшения времени ответа системы.
4. хАчу свой интернет-магазин!!!
Есть интернет-магазин
〉 много разных товаров с разными свойствами
〉 полнотекстовый поиск по названиям/описанию товара
〉 вычислять статистику
〉 учитывать «историю» пользователя
〉 выдавать ответ за приемлемое время
Базы данных с этим справятся плохо:(
4
9. Lucene vs Solr
Many people new to Lucene and Solr will ask the obvious
question: Should I use Lucene or Solr?
The answer is simple: if you're asking yourself this question,
in 99% of situations, what you want to use is Solr.
http://www.lucenetutorial.com/lucene-vs-solr.html 9
12. Возможности Solr
〉 полнотекстовый поиск
〉 подсветка результатов
〉 фасетный поиск
〉 динамическая кластеризация
〉 интеграция с базами данных
〉 обработка документов со сложным форматом
(например, Word, PDF)
12
13. Пару слов про настройку Solr
Где скачать
http://lucene.apache.org/solr/mirrors-solr-latest-redir.html
Как установить
https://wiki.apache.org/solr/SolrInstall
13
16. Встроенные анализаторы
〉lucene – по умолчанию
〉dismax – позволяет запросы по многим полям с
разным весом
〉edismax – расширенный dismax
〉func
〉boost
〉….
https://wiki.apache.org/solr/QueryParser 16
31. Какие же проблемы возникают
〉 медленная работа при получении данных
〉 не для всех фасетов все фильтры
〉 не хватает facet.prefix
〉 нужно учитывать «историю» пользователя
31
32. Медленная работа при получении данных
Solr – не система хранения, это система для индексации и
поиска!
32
34. Solr vs MYSQL немного больше параметров поиска
src/test/java/com/yandex/java/party/shop/SolrAgainsMysqlGettingTestManyParamters 34
Секунд
0
160
320
480
640
800
960
1120
1280
1440
1600
mysql solr
время выполнения 200K запросов при 8 фильтрах, однопоточно, по
1486
35
35. Но как быстро все таки ищет Solr
- А влияет на это размер индекса?
35
К примеру 100K запросов с 8 фильтрами…
36. Получение 100K id по запросу с фильтрами в
зависимости от размера индекса
src/test/java/com/yandex/java/party/shop/QueryTest.java
36
Секунд
Размер индекса
0
8,5
17
25,5
34
500K 1M 2M 4M
время выполнения 100K запросов с 8 параметрами, однопоточно
37. Не для всех фасетов все фильтры
Не хотим учитывать цену в фасете по годам.
q=*:*&fq=os:MACOS&fq=price:[* TO 2000]&facet.field=years
q=*:*&fq=os:MACOS
&fq={!tag=price_tag}price:[* TO 2000]
&facet.field={!ex=price_tag}years
37
38. Как влияют теги на производительность
фасетов
src/test/java/com/yandex/java/party/shop/FacetTest.java 38
Секунд
0
100
200
300
400
500
Без тегов С тегами
Время для 100K запросов с 8 фасетами
39. Не хватает facet.prefix, но есть facet.query
Нужно учесть серийный номер с закодированным цветом или
же найти количество определенных вещей:
year:[2010 TO 2015] AND ram:[8 TO 12] AND owner:/.*Her.*/"
НО: facet.query не многопоточный пока:(
39
40. На сколько facet.query быстр?
src/test/java/com/yandex/java/party/shop/FacetTest.java 40
15
19,2
23,4
27,6
31,8
36
1 2 4 8
с тегами
без тегов
Секунд
Facet Query в одном запросе
100K запросов
41. Нужно учитывать «историю» пользователя
Хочу купить!
〉 Вывести с учетом фильтров, которые просмотрел/
выбрал/купил. А что если их больше 1000?
〉 Не выводить, которые просмотрел/выбрал/купил. И
опять же больше 1000!
41
42. Выводить с учетом фильтров
42
«Желанные товары, должны быть
в начале поисковой выдачи», говорили они
А что если «желалок» много?
Смотря на сколько
45. Запрос с дополнительными фильтрами по id
src/test/java/com/yandex/java/party/shop/QueryWithALotOfParameters.java
45
0
17,5
35
52,5
70
500 1000 1500 2000 2500 3000
5K запросов
ids в запросе
Секунд
46. А если разбить на подзапросы и
src/test/java/com/yandex/java/party/shop/QueryWithALotOfParameters.java 46
0
17,5
35
52,5
70
500 1000 1500 2000 2500 3000
1 запрос
2 запроса
4 запроса
ids в запросе
Секунд
47. Не выводить
«Уже купленные товары - не отображать», говорили
они.
Не получится разбить! Как быть?!
Индексация пользователя в каждый товар :)
47
48. А на сколько же быстра индексация в Solr?
1М объектов по X
src/test/java/сom/yandex/java/party/shop/SolrInsertTest.java 48
Секунд
Размер пачки
0
160
320
480
640
800
100 500 1К 2К 5К 10К 20К
Время добавления 1М объектов
49. А индексировать больше миллиона можно?
src/test/java/сom/yandex/java/party/shop/SolrInsertTest.java 49
0
400
800
1200
1600
500к 1М 2М 3М 4М 5М 6М 7М 8М 9М 10М 11М
Количество элементов
Секунд
50. Ок, все вроде хорошо
А как потом это тестировать?
50
51. Embedded server
File solrHome = new File( "path/solr" );
File configFile = new File( solrHome, "solr.xml" );
CoreContainer coreContainer =
CoreContainer.createAndLoad(
solrHome.toString(),
configFile );
SolrServer solr =
new EmbeddedSolrServer(
coreContainer,
"collectionName" );
51
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.4</version>
</dependency>
52. Подведем итоги!
〉Solr — мощная система
〉много мест для оптимизации
〉определенно стоит попробовать в своих проектах!
52
53. 〉 https://wiki.apache.org/solr/
〉 Solr in Action, Trey Grainger and Timothy Potter
Исходный код:
〉 https://bitbucket.org/nkaraman/javapartyshop/src
53
Почитать/посмотреть