Производительность параметрического поиска на основе...

56

Transcript of Производительность параметрического поиска на основе...

Page 1: Производительность параметрического поиска на основе опенсорс-платформы
Page 2: Производительность параметрического поиска на основе опенсорс-платформы

Производительность параметрического поиска на основе опенсорс-Николай Караман, Максим Терновой

Page 3: Производительность параметрического поиска на основе опенсорс-платформы

Зачем нам поисковые движки?

Page 4: Производительность параметрического поиска на основе опенсорс-платформы

хАчу свой интернет-магазин!!!

Есть интернет-магазин

〉 много разных товаров с разными свойствами

〉 полнотекстовый поиск по названиям/описанию товара

〉 вычислять статистику

〉 учитывать «историю» пользователя

〉 выдавать ответ за приемлемое время

Базы данных с этим справятся плохо:(

4

Page 5: Производительность параметрического поиска на основе опенсорс-платформы

Search engine спешит на помощь!

〉Solr

〉ElasticSearch

〉Splunk

〉MarkLogic

〉Sphnix

http://db-engines.com/en/ranking/search+engine 5

Page 6: Производительность параметрического поиска на основе опенсорс-платформы

Наш выбор – Solr

Page 7: Производительность параметрического поиска на основе опенсорс-платформы

Solr

〉 open-source платформа полнотекстового поиска

〉 под капотом Apache Lucene

〉 является самым популярным поисковым движком

7

Page 8: Производительность параметрического поиска на основе опенсорс-платформы

А почему не Lucene?

8

Page 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

Page 10: Производительность параметрического поиска на основе опенсорс-платформы

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.

Page 11: Производительность параметрического поиска на основе опенсорс-платформы

Lucene vs Solr

Lucene – библиотека

Solr – приложение «из коробки»

11

Page 12: Производительность параметрического поиска на основе опенсорс-платформы

Возможности Solr

〉 полнотекстовый поиск

〉 подсветка результатов

〉фасетный поиск

〉 динамическая кластеризация

〉 интеграция с базами данных

〉 обработка документов со сложным форматом (например, Word, PDF)

12

Page 13: Производительность параметрического поиска на основе опенсорс-платформы

Пару слов про настройку Solr

Где скачать

http://lucene.apache.org/solr/mirrors-solr-latest-redir.html

Как установить

https://wiki.apache.org/solr/SolrInstall

13

Page 14: Производительность параметрического поиска на основе опенсорс-платформы

Запросы в Solr

Page 15: Производительность параметрического поиска на основе опенсорс-платформы

Анализаторы запросов (Query Parsers)

преобразуют текстовый запрос в запрос соответствующий объектам Lucene Query

задать парсер

〉 defType параметр

defType=lucene

〉 локальный параметр

{!dismax}

15

Page 16: Производительность параметрического поиска на основе опенсорс-платформы

Встроенные анализаторы

〉lucene – по умолчанию〉dismax – позволяет запросы по многим полям с разным весом〉edismax – расширенный dismax〉func 〉boost〉….

https://wiki.apache.org/solr/QueryParser 16

Page 17: Производительность параметрического поиска на основе опенсорс-платформы

Синтаксис запроса

Page 18: Производительность параметрического поиска на основе опенсорс-платформы

Что скрывается за этими буквами?

〉 q

〉 fq

〉 facet

18

Page 19: Производительность параметрического поиска на основе опенсорс-платформы

q

q – запрос вида: os:MACOS AND price:[* TO 2000]

〉 fq

〉 facet

19

Page 20: Производительность параметрического поиска на основе опенсорс-платформы

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

Page 21: Производительность параметрического поиска на основе опенсорс-платформы

Зачем такое дублирование?

q – с учетом score

fq – без учета score => fq быстрее

21

Page 22: Производительность параметрического поиска на основе опенсорс-платформы

График сравнения query и filterQuery

src/test/java/com/yandex/java/party/shop/FqAgainsQTest.java 22

0

17,5

35

52,5

70

fq q

время выполнения 200K запросов при 8 фильтрах, однопоточноСекунд

Page 23: Производительность параметрического поиска на основе опенсорс-платформы

facet

Отдельный определяющий аспект пространства значений

Каждый аспект характеризует пространство значений вдоль какой-либо независимой оси или измерения

http://wiki.iis.ru/wiki/Фасет 23

Page 24: Производительность параметрического поиска на основе опенсорс-платформы

facet

〉 q

〉 fq

facet

〉 facet.field

〉 facet.prefix

〉 facet.query

〉 facet.pivot

24

Page 25: Производительность параметрического поиска на основе опенсорс-платформы

facet.field

〉 q

〉 fq

facetfacet.field=os

〉 facet.prefix

〉 facet.query

〉 facet.pivot

25

Page 26: Производительность параметрического поиска на основе опенсорс-платформы

facet.prefix

〉 q

〉 fq

facetfacet.field=osfacet.prefix=WINDOWS

〉 facet.query

〉 facet.pivot

26

Page 27: Производительность параметрического поиска на основе опенсорс-платформы

facet.query

〉 q =os:MACOS AND price:[* TO 2000]

〉 fq

facet

〉 facet.field

〉 facet.prefix

facet.query=height:[* TO 150]

〉 facet.pivot

27

Page 28: Производительность параметрического поиска на основе опенсорс-платформы

facet.pivot

〉 q

〉 fq

facet

〉 facet.field

〉 facet.prefix

〉 facet.query

facet.pivot=os,year,…

28

Page 29: Производительность параметрического поиска на основе опенсорс-платформы

Немного примеров на живом Solr (админка)

http://localhost:8983/solr/#/shop/query 29

Page 30: Производительность параметрического поиска на основе опенсорс-платформы

И вроде все хорошо, но…

Page 31: Производительность параметрического поиска на основе опенсорс-платформы

Какие же проблемы возникают

〉 медленная работа при получении данных

〉 не для всех фасетов все фильтры

〉 не хватает facet.prefix

〉 нужно учитывать «историю» пользователя

31

Page 32: Производительность параметрического поиска на основе опенсорс-платформы

Медленная работа при получении данных

Solr – не система хранения, это система для индексации и поиска!

32

Page 33: Производительность параметрического поиска на основе опенсорс-платформы

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)

Page 34: Производительность параметрического поиска на основе опенсорс-платформы

Solr vs MYSQL немного больше параметров поиска

src/test/java/com/yandex/java/party/shop/SolrAgainsMysqlGettingTestManyParamters 34

Секунд

0160320480640800960

1120128014401600

mysql solr

время выполнения 200K запросов при 8 фильтрах, однопоточно, по 12

1486

35

Page 35: Производительность параметрического поиска на основе опенсорс-платформы

Но как быстро все таки ищет Solr

- А влияет на это размер индекса?

35

К примеру 100K запросов с 8 фильтрами…

Page 36: Производительность параметрического поиска на основе опенсорс-платформы

Получение 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 параметрами, однопоточно

Page 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

Page 38: Производительность параметрического поиска на основе опенсорс-платформы

Как влияют теги на производительность фасетов

src/test/java/com/yandex/java/party/shop/FacetTest.java 38

Секунд

0

100

200

300

400

500

Без тегов С тегами

Время для 100K запросов с 8 фасетами

Page 39: Производительность параметрического поиска на основе опенсорс-платформы

Не хватает facet.prefix, но есть facet.query

Нужно учесть серийный номер с закодированным цветом или же найти количество определенных вещей:year:[2010 TO 2015] AND ram:[8 TO 12] AND owner:/.*Her.*/"

НО: facet.query не многопоточный пока:(

39

Page 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 запросов

Page 41: Производительность параметрического поиска на основе опенсорс-платформы

Нужно учитывать «историю» пользователя

Хочу купить!

〉Вывести с учетом фильтров, которые просмотрел/выбрал/купил. А что если их больше 1000?

〉Не выводить, которые просмотрел/выбрал/купил. И опять же больше 1000!

41

Page 42: Производительность параметрического поиска на основе опенсорс-платформы

Выводить с учетом фильтров

42

«Желанные товары, должны быть в начале поисковой выдачи», говорили они

А что если «желалок» много?

Смотря на сколько

Page 43: Производительность параметрического поиска на основе опенсорс-платформы

Как бы выглядели подобные запросы?

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:

Page 44: Производительность параметрического поиска на основе опенсорс-платформы

Как бы выглядели подобные запросы?

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

Page 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 в запросе

Секунд

Page 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 в запросе

Секунд

Page 47: Производительность параметрического поиска на основе опенсорс-платформы

Не выводить

«Уже купленные товары - не отображать», говорили они.

Не получится разбить! Как быть?!

Индексация пользователя в каждый товар :)

47

Page 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М объектов

Page 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МКоличество элементов

Секунд

Page 50: Производительность параметрического поиска на основе опенсорс-платформы

Ок, все вроде хорошо

А как потом это тестировать?

50

Page 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>

Page 52: Производительность параметрического поиска на основе опенсорс-платформы

Подведем итоги!

〉Solr — мощная система

〉много мест для оптимизации

〉определенно стоит попробовать в своих проектах!

52

Page 53: Производительность параметрического поиска на основе опенсорс-платформы

〉 https://wiki.apache.org/solr/

〉Solr in Action, Trey Grainger and Timothy Potter

Исходный код:

〉 https://bitbucket.org/nkaraman/javapartyshop/src

53

Почитать/посмотреть

Page 54: Производительность параметрического поиска на основе опенсорс-платформы

Спасибо!

Page 55: Производительность параметрического поиска на основе опенсорс-платформы

Вопросы?

Page 56: Производительность параметрического поиска на основе опенсорс-платформы

56

Николай Караман

Разработчик

Контакты

[email protected]

Максим Терновой

Разработчик

[email protected]