Производительность параметрического поиска на основе...
TRANSCRIPT
Производительность параметрического поиска на основе опенсорс-Николай Караман, Максим Терновой
Зачем нам поисковые движки?
хАчу свой интернет-магазин!!!
Есть интернет-магазин
〉 много разных товаров с разными свойствами
〉 полнотекстовый поиск по названиям/описанию товара
〉 вычислять статистику
〉 учитывать «историю» пользователя
〉 выдавать ответ за приемлемое время
Базы данных с этим справятся плохо:(
4
Search engine спешит на помощь!
〉Solr
〉ElasticSearch
〉Splunk
〉MarkLogic
〉Sphnix
…
http://db-engines.com/en/ranking/search+engine 5
Наш выбор – Solr
Solr
〉 open-source платформа полнотекстового поиска
〉 под капотом Apache Lucene
〉 является самым популярным поисковым движком
7
А почему не Lucene?
8
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
http://www.lucenetutorial.com/lucene-vs-solr.html
A simple way to conceptualize the
relationship between Solr and Lucene is
that of a car and its engine. You can't drive
an engine, but you can drive a car.
Lucene vs Solr
Lucene – библиотека
Solr – приложение «из коробки»
11
Возможности Solr
〉 полнотекстовый поиск
〉 подсветка результатов
〉фасетный поиск
〉 динамическая кластеризация
〉 интеграция с базами данных
〉 обработка документов со сложным форматом (например, Word, PDF)
12
Пару слов про настройку Solr
Где скачать
http://lucene.apache.org/solr/mirrors-solr-latest-redir.html
Как установить
https://wiki.apache.org/solr/SolrInstall
13
Запросы в Solr
Анализаторы запросов (Query Parsers)
преобразуют текстовый запрос в запрос соответствующий объектам Lucene Query
задать парсер
〉 defType параметр
defType=lucene
〉 локальный параметр
{!dismax}
15
Встроенные анализаторы
〉lucene – по умолчанию〉dismax – позволяет запросы по многим полям с разным весом〉edismax – расширенный dismax〉func 〉boost〉….
https://wiki.apache.org/solr/QueryParser 16
Синтаксис запроса
Что скрывается за этими буквами?
〉 q
〉 fq
〉 facet
18
q
q – запрос вида: os:MACOS AND price:[* TO 2000]
〉 fq
〉 facet
19
fq
〉 q =os:MACOS AND price:[* TO 2000]
fq - фильтрующий запрос
1. q=*:*&fq=os:MACOS AND price:[* TO 2000]
2. q=*:*&fq=os:MACOS&fq=price:[* TO 2000]
〉 facet
20
Зачем такое дублирование?
q – с учетом score
fq – без учета score => fq быстрее
21
График сравнения query и filterQuery
src/test/java/com/yandex/java/party/shop/FqAgainsQTest.java 22
0
17,5
35
52,5
70
fq q
время выполнения 200K запросов при 8 фильтрах, однопоточноСекунд
facet
Отдельный определяющий аспект пространства значений
Каждый аспект характеризует пространство значений вдоль какой-либо независимой оси или измерения
http://wiki.iis.ru/wiki/Фасет 23
facet
〉 q
〉 fq
facet
〉 facet.field
〉 facet.prefix
〉 facet.query
〉 facet.pivot
24
facet.field
〉 q
〉 fq
facetfacet.field=os
〉 facet.prefix
〉 facet.query
〉 facet.pivot
25
facet.prefix
〉 q
〉 fq
facetfacet.field=osfacet.prefix=WINDOWS
〉 facet.query
〉 facet.pivot
26
facet.query
〉 q =os:MACOS AND price:[* TO 2000]
〉 fq
facet
〉 facet.field
〉 facet.prefix
facet.query=height:[* TO 150]
〉 facet.pivot
27
facet.pivot
〉 q
〉 fq
facet
〉 facet.field
〉 facet.prefix
〉 facet.query
facet.pivot=os,year,…
28
Немного примеров на живом Solr (админка)
http://localhost:8983/solr/#/shop/query 29
И вроде все хорошо, но…
Какие же проблемы возникают
〉 медленная работа при получении данных
〉 не для всех фасетов все фильтры
〉 не хватает facet.prefix
〉 нужно учитывать «историю» пользователя
31
Медленная работа при получении данных
Solr – не система хранения, это система для индексации и поиска!
32
33src/test/java/com/yandex/java/party/shop/MysqlGettingTest.java src/test/java/com/yandex/java/party/shop/SolrGettingTest.java
0
10
20
30
40
4 12 24 100 1000 2000
MYSQLSolrСекунд
Размер пачки
Solr vs MYSQL получение 200K элементов по Х элементов (используя id)
Solr vs MYSQL немного больше параметров поиска
src/test/java/com/yandex/java/party/shop/SolrAgainsMysqlGettingTestManyParamters 34
Секунд
0160320480640800960
1120128014401600
mysql solr
время выполнения 200K запросов при 8 фильтрах, однопоточно, по 12
1486
35
Но как быстро все таки ищет Solr
- А влияет на это размер индекса?
35
К примеру 100K запросов с 8 фильтрами…
Получение 100K id по запросу с фильтрами в зависимости от размера индекса
src/test/java/com/yandex/java/party/shop/QueryTest.java36
Секунд
Размер индекса
0
8,5
17
25,5
34
500K 1M 2M 4M
время выполнения 100K запросов с 8 параметрами, однопоточно
Не для всех фасетов все фильтры
Не хотим учитывать цену в фасете по годам.
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
Как влияют теги на производительность фасетов
src/test/java/com/yandex/java/party/shop/FacetTest.java 38
Секунд
0
100
200
300
400
500
Без тегов С тегами
Время для 100K запросов с 8 фасетами
Не хватает facet.prefix, но есть facet.query
Нужно учесть серийный номер с закодированным цветом или же найти количество определенных вещей:year:[2010 TO 2015] AND ram:[8 TO 12] AND owner:/.*Her.*/"
НО: facet.query не многопоточный пока:(
39
На сколько 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 запросов
Нужно учитывать «историю» пользователя
Хочу купить!
〉Вывести с учетом фильтров, которые просмотрел/выбрал/купил. А что если их больше 1000?
〉Не выводить, которые просмотрел/выбрал/купил. И опять же больше 1000!
41
Выводить с учетом фильтров
42
«Желанные товары, должны быть в начале поисковой выдачи», говорили они
А что если «желалок» много?
Смотря на сколько
Как бы выглядели подобные запросы?
43
q=*%3A*&limit=12&offset=46&fq=year%3A%28%221999%22%29&fq=is_free_shipping%3A%28%22true%22%29&fq=graphic_adapter%3A%28%22ARM+Mali-T760%22%29&fq=color%3A%28%22Black%22%29&fq=location%3A%28%22CHINA%22%29&fq=os%3A%28%22MacOs%22%29&fq=storage_type%3A%28%22CD%22%29&fq=manufactured_in_city%3A%28%22Kiev%22%29&fq=id%3A%28745044+150655+654386+96643+720589+539414+299652+520272+289108+551627+83837+49092+512823+449487+751968+263210+393184+192611+937748+189766+201049+409053+485720+868563+364079+827460+608443+696274+706465+706148+868334+814274+68423+673793+227055+483215+638204+447773+835321+257405+569050+675653+331887+414714+212005+252369+476497+54924+475628+505340+463800+259425+988975+744874+614420+850365+646403+810301+948395+466020+915456+827734+591687+418190+684721+392407+929494+595189+108977+41683+19010+490934+363326+177203+456386+668946+480791+746274+515179+690288+902657+308506+154556+480277+223309+585100+795848+720235+304557+755958+755461+367772+94107+893517+638598+426080+807437+131045+925255+187938+596366+391724+323633+629939+646436+662786+990833+925361+595827+215784+33321+903755+343186+633119+421082+776447+810374+705331+887675+908318+238245+859773+877837+334673+587335+325171+844978+5917+816251+543908+879951+402703+822408+771204+681177+874421+897696+753330+109102+873754+450216+759885+849343+31332+669469+485518+678774+477750+774354+38843+122058+950977+451747+956756+678819+578293+517789+513042+83980+881812+665169+493494+538890+898710+594116+751579+561832+882199+902086+498571+353318+589182+207314+160343+676971+657597+928936+189316+950723+812690+287199+573909+117120+125536+267361+586201+883775+61882+905887+531929+259845+528074+517591+168795+888833+457907+692268+781542+236931+946449+168709+985315+26313+343041+153917+4016+570144+696623+704453+189989+297214+414314+195445+109684+758562+431191+197008+37538+436833+122759+416905+433978+999644+526498+935995+9998+73079+641612+738138+844904+526766+784234+629673+458027+455283+647791+819571+16176+459625+556043+278398+6891+125105+510487+136548+26066+302307+491523+455440+530322+372340+605337+228046+77965+557263+779416+880931+526308+181754+490003+430891+550993+890562+377247+446861+139870+283759+356579+185707+804269+323319+157097+413721+284364+192535+661775+965084+932195+314572+705707+885878+130290+687176+143577+17641+207914+862781+916736+355881+424167+872562+507526+248844+83499+35006+716268+844720+585634+504486+812618+750735+947712+289875+565280+176836+823210+206490+439921+313986+654616+487771+950328+573913+137704+211804+52653+438096+964650+790409+474877+104865+311559+471614+476655+131447+120515+829642+355741+570968+436883+314489+722880+29518+528926+27717+600247+450313+9378+435926+231626+35400+802167+336779+568958+476819+125510+156080+884736+883460+238300+608856+581064+740925+475692+547312+658882+984941+266591+998629+99293+118513+671589+182193+43416+863221+540394+107668+488708+863529+653383+942879+490630+731715+929490+179013+997587+58778+860379+730898+949367+578149+56208+985687+963959+10164+537498+249523+937237+864398+381655+921577+239411+25371+533819+366166+36695+47186+14192+450999+515793+575252+600483+559035+746230+328760+796671+392156+800208+607257+554083+210043+408316+698627+875110+445356+255801+254080+816170+314492+340863+376978+216076+568789+79684+165754+781695+181039+64085+616319+448756+859563+530911+833361+891068+578399+850711+556077+973661+572221+250572+542093+451242+262718+202677+104078+842846+745168+593077+243799+796101+685466+345955+184207+305687+346599+239441+885417+728553+710651+467177+112650+726423+553917+530687+944561+465027+990139+641205+324716+255164+792897+679520+303884+926089+314953+282035+198142+903823+621627+797933+695757+65427+335470+962306+678627+549719+738860+613898+757610+832340+470239+699860+705261+63399+972008+826424+487379+547446+567908+431271+685756%29&sort=year+asc%2Cprice+asc%2Cbase_price+asc%2Cid+asc
500 ids:
Как бы выглядели подобные запросы?
44
1000 ids:q=*%3A*&limit=12&offset=19&fq=year%3A%28%221996%22%29&fq=is_free_shipping%3A%28%22true%22%29&fq=graphic_adapter%3A%28%22Amd%22%29&fq=color%3A%28%22WHO+KNOWS%3F%22%29&fq=location%3A%28%22USA%22%29&fq=os%3A%28%22Windows%22%29&fq=storage_type%3A%28%22WHO+KNOWS%3F%22%29&fq=manufactured_in_city%3A%28%22Paris%22%29&fq=id%3A%2881201+387157+955839+537448+257298+957836+213542+43934+489038+222336+187761+269044+875755+696484+294845+803004+178071+229714+826747+136867+928540+616502+727577+564158+110072+480792+497353+339159+225401+791355+125133+972987+514921+118371+656018+306219+696665+27891+345083+866248+146961+540296+266336+416950+257205+282630+62985+458779+512164+602785+73025+143233+676640+352166+603993+628690+995355+11531+49358+115794+829521+28701+26276+919822+254364+542426+251347+658854+213413+538408+427765+40223+364442+592600+508337+192796+732416+515392+286270+12052+569595+328630+405327+227078+205524+190405+545212+922894+346513+622505+979747+704690+641546+459224+624135+759548+838171+450330+6568+643933+198180+995099+221572+958566+873661+743817+889484+721869+512549+292299+443850+886182+96543+513300+867437+854212+349161+464594+252496+636330+281650+501254+37170+294721+304639+366687+146914+517408+50198+579477+448612+883730+89816+775660+545993+855630+867998+888915+51431+914443+696764+311459+459755+223614+470560+445575+544882+7144+666566+943287+559333+220419+985003+924601+714887+427149+198729+681018+243847+11034+925150+857982+403233+112638+587057+100581+475825+676783+888656+145151+310208+561958+613276+143279+623623+547657+267499+682774+640213+403092+963156+111694+248853+759045+818772+53418+594743+10234+135961+960370+979861+858583+956709+151013+848587+899885+511837+625864+609580+741464+518492+619459+621080+551144+57502+237561+126329+843650+849193+532473+699621+967608+508422+650070+573129+881737+345092+48880+505823+868399+210355+813955+30990+647611+280044+137898+816823+351015+589590+706381+169334+656395+471543+834456+250374+125270+691610+753037+795393+850674+746749+166811+231304+919284+737632+460475+355544+694622+927872+971746+65976+718297+866053+572140+699907+473575+283054+145235+509957+974538+626436+400597+44011+357809+993313+741430+169054+443323+428121+920277+955691+384095+338081+377204+935130+416678+626770+342102+283568+670478+955106+183833+884211+652827+284044+380241+971400+104070+681720+698582+19695+928671+594355+282404+747536+841774+784186+577452+851844+796764+757278+511959+824818+267222+676903+944005+144937+683615+617267+177195+445897+424770+736457+545454+246595+5729+551385+54522+896231+548890+555556+446582+995948+839981+188389+149929+341872+693607+782631+935956+713148+65148+679127+486577+579971+976986+16899+292310+132553+159613+506404+994375+178459+40634+843043+129961+483709+982932+325940+747504+606473+345693+634104+874878+438985+969317+518037+622701+306115+45863+504681+847541+514181+818617+636950+163237+770656+857228+819623+170936+113607+966507+881125+105916+794445+421021+950727+423923+138394+780043+512356+891257+731606+244036+884868+653812+552738+919534+691300+676726+351295+766410+153076+14247+564607+548803+379310+24948+339329+759277+786195+544349+463255+776990+52389+531284+957129+800415+942994+227592+279235+715837+616570+985698+794122+323191+184410+233369+626627+795206+905489+369550+868770+348215+180337+716473+155946+146709+135996+304638+560265+665780+858919+873136+451527+732505+427317+461563+679755+297479+838138+977984+241998+68387+568422+953432+78704+250397+333432+727191+790896+407387+760546+43013+895745+833700+444729+172837+201043+611271+377323+668696+17440+504858+5615+405365+954105+884489+716243+639321+914170+210402+146796+578286+424629+966048+24769+432541+191986+212341+313327+285988+145571+744996+168153+441849+833298+387834+791458+643489+461843+26804+90196+774655+9774+590942+251355+578620+5480+700457+772636+871377+382911+802067+440989+771705+605478+116053+261922+234810+662230+302648+707030+477846+173955+256729+783095+657031+353929+137701+801503+676327+958656+922021+89777+682877+674917+717473+913668+628235+97093+194674+2611+34289+901486+156675+662193+314246+729884+976444+693477+902740+467695+482973+453754+459957+997287+383027+17493+633895+382631+509320+203825+75117+395636+73555+641652+153628+275442+322325+405441+74708+783623+597349+67662+502592+617069+257942+812097+945246+161731+908148+141901+997738+409241+308227+138409+778679+769673+915817+28570+694447+10016+184696+32764+236716+713734+840825+494310+547038+887184+274493+899691+29466+159405+70428+469496+48204+738907+405569+873568+583149+166965+408814+800115+149323+206593+873937+827167+267942+576309+297612+169438+311810+916813+305988+663+789795+527502+234871+726182+252505+648233+87822+963674+364608+673236+465170+867998+113670+925374+221057+418284+508655+568137+203705+443789+660437+89795+411708+977723+983759+826092+46219+478221+349916+244028+718371+381535+907594+343324+822688+227596+946552+604257+319487+321306+193276+954575+937481+704124+605678+238112+509731+534586+37587+547160+840030+149783+981563+126425+420844+17406+564332+11442+648166+405121+1531+144737+615645+369862+821968+547488+473364+199687+702711+730880+64717+565734+245945+786351+337501+711894+877084+573107+581101+70749+599213+671240+298268+767056+503429+204374+790650+605825+102835+981087+113790+387534+741507+881739+93291+376390+586493+979099+977263+81636+272338+632403+294933+872397+984601+69283+630409+384127+142112+528030+724759+120895+466681+97475+794836+150537+74885+982878+494867+768414+303522+791920+998965+311184+465505+878690+536389+816568+394585+934700+622858+576379+335115+184495+895726+33380+857494+309059+891066+591572+724391+828362+242909+35878+447895+910320+964918+359773+90523+513187+317734+412074+973923+457815+401348+510371+849825+198605+547234+780749+67372+938539+88716+418973+11284+832725+442694+50195+468110+648857+84006+903872+212087+107935+197009+441007+567313+636809+670609+448557+906507+58546+766556+597440+575292+255055+709919+363983+977199+310902+930950+640688+245762+819248+719826+520053+274797+388958+540324+317290+526551+828136+813389+190236+895065+623227+813490+943565+912339+101648+352749+41107+796875+878426+284616+411510+447007+951922+884005+522236+632072+647037+581626+457178+703017+481235+858223+364215+369606+959273+575441+799803+521658+575844+706792+658752+743126+169316+899740+396534+987723+890804+424980+473285+813867+979670+807457+969371+23813+325010+774551+670269+502436+87971+742461+187971+62528+364013+399549+836854+795153+62425+915156+138118+371203+50659+503027+340484+576244+456541+546114+402037+229136+255303+598347+55442+990453+288931+199392+606107+585383+351046+754628+19863+574407+170796+581928+697699+656191+974996+147680+798293+989472+579253+165174+699061+944023+310782+44917+412353+435459+338132+178568+19441+147174+340295+88989+165153+474139+535088+746491+998514+74939+436846+872477+485607+700927+802264+580942+410449+276515+987870+732577+315010+589616+421398+972094+910544+264825+533917+443831+363850+920247+775899+790648+540243+675297+16587+872881+709158+105318+245448+589075+523081+678598+732670+43458+972315+855474+933960+109033+16474+848995+570834+327992+636233+854599+848366+755253+218973+319261+384487+293568+940861+851668+388169+17815+757247+174307+816633+912532+621594+535644+796578+888788+35320+690844+217393+745102+959387+732347+40475+702740+478918%29&sort=year+asc%2Cprice+asc%2Cbase_price+asc%2Cid+asc
Запрос с дополнительными фильтрами по 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 в запросе
Секунд
А если разбить на подзапросы и
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
А на сколько же быстра индексация в 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М объектов
А индексировать больше миллиона можно?
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
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>
Подведем итоги!
〉Solr — мощная система
〉много мест для оптимизации
〉определенно стоит попробовать в своих проектах!
52
〉 https://wiki.apache.org/solr/
〉Solr in Action, Trey Grainger and Timothy Potter
Исходный код:
〉 https://bitbucket.org/nkaraman/javapartyshop/src
53
Почитать/посмотреть
Спасибо!
Вопросы?
56
Николай Караман
Разработчик
Контакты
Максим Терновой
Разработчик