概要

DjangoとAWS OpenSearchを接続する方法に関するメモです。以下の記事が参考になりました。

https://testdriven.io/blog/django-drf-elasticsearch/

ただし、上記の記事はElasticsearchを対象にした設定のため、OpenSearchに応じた変更が必要です。

変更点

以下のElasticsearch Setupの部分から、OpenSearchに応じた変更が必要でした。

https://testdriven.io/blog/django-drf-elasticsearch/#elasticsearch-setup

具体的には、以下の2つのライブラリが必要でした。

((eennvv))$$ppiippiinnssttaallllodpjeannsgeoa-rocphe-npsyearch-dsl

その後は、django_elasticsearch_dslとなっている箇所をdjango-opensearch-dslに、elasticsearch_dslopensearchpyに書き換えることで、記事の通りに進めることができました。

例えば、以下のような形です。

#ffff@c@c@crrrrrlrlrlbooooeaeaealmmmmgsgsgsoisccisiccisa}c}tccgdddbsllsdllsu)a)yll/jjjltUaatCaatAttpaadaaaorsssra=ssrrheessonnngyesns}smf]ytsns}smf]yto''''g'''sns}smf]cggg..raeoi.efaeoi.irifluoind=aeoiuooomrDImtDdergiImtDdercdiasrdaeImtDdem.__oeonetjeleoenetjelel='rsei'msfnetjelecoodgcdi''ald''''grldi''ald''ge:stre:ecidi''ald''''noppeiue=nnnnsifluiyde=nnnnsndiDft_ns'ree=nnnnstccutneelsmxguug=diassDsxguug=aesoif_naf:ilxguug=iorpstnnste:'smmo='rseto.:'smmo=mstceinam=ipd:'smmo=tned.rssenubb:U,strecIcbb:Ceceuleameeftsabb:Altaapieeirts=ees[t_nruna=eea['rrmdlme'flii.r=eer[eettybaam_(erre_na_mttrrt,i_esde':ideoTtrrt'nee.rrpdDr{__rnamdeee{__epdn.s':eslnei{__i,tddaccooosooameonggoogtotO.:fl.d'xcooc'__uhhrcc'ffme'cteoffoic(bIfidIs:tlffl,ddt__tuu__e',u(rr__rouDjnfiesn.Fe__eaahddmmsr',mDFisrynmoetiel.tTfissrtt.ssCeehe,eoiehe'ecceeldOeeie'heeemllannapncesap,nutgldsbgxelaptto.tttrltul'rltmFeds.jetldrliidire)dimddieirs.TerFd(dimmemeg:sce(scneF.TecFisasceelpgo'an)'atliTextie.t'a''soir:st:s)deextFelTt:s,,rsy')':(lxtFilder'itt,1::1:pdtFied(x=1:mr,,r(Fiel()t',pDiA00o)ield),Ft0ooer,,p,eld(,iy,rcsteld(peptuird()rlemict(),od_Uemli),p(tsnpee,e)oetosr,_r,r=tst{itferirsiee=nlg{gdi'ss)t#ryop#enospeeanrsceharch

Populate Elasticsearch

Elasticsearchを対象にした上記の記事では、以下のコマンドが紹介されています。

pythonmanage.pysearch_index-rebuild

一方、OpenSearchの場合は、以下のコマンドが必要でした。

インデックスの作成

pTCCCCyhorrrteneeehtaaaofitttnoniiilunnnmlegggao---nw?iiiaiucannngnsar[dddegettyeee.rei]xxxpisgceyn.ols'''dreucaoiis[sarpce.nettees]reins.osgcs'olew:.reai.isrly.e'cls.hO'.bK..ie.n.OdcKerOxeKactreeda:te

ドキュメントの登録

pTCIII535yhonnntendddUCAhteeesarofixxxettnoniiirei3lunnngclegggsolmo---ureaw?535cyni535csan[UCAesuggUCAysarsucesar]ettscc.dettereifceporeis:gcuesyc.gcollssuol[OrelsfomrenKy:yfupey.]:ulen.oOillntOKnlyss:Kdyeeiawyxinriendclddehl,exxedb0edoed,ce,uir0mnr0edoenerertxsrre:roidorn:rsds:e:x

インデックスのリビルド

pythonmanage.pyopensearchindexrebuild

その他:analyzerとfieldsの追加

以下の部分に記載されているField Classesを試します。

https://django-opensearch-dsl.readthedocs.io/en/latest/fields/#field-classes

以下の例では、usernameについて、html_stripというanalyzerと、Keywordフィールドを設定しています。

#fffffh@crrrrrtrlbooooomealmmmmmlgso_'tfcisuccgdddboshoihssll/jjjlpttklatUeaadaaaoermetrrsrssonnngnilne_yenafsns}smf]cggg.sp_irf.raniaeoiuooomesz=irDmaeImtDdem.__oa=te[leoellnetjelecoodrrr"tgcyddi''ald'''#noppecai=leiu=zse=nnnnsifltneelhnp"orsme=xguug=dia'stnnspa'sw=tefr{:'smmo='rsu.rssyl,te[eni='ubb:U,stspieeiyar"rtehrs=ees[t_eybaamiznch_(ltaerre_nr.rrpmedatdDdmwr{__rnanaccoprasmoosl'sooamauhhro(relcc._:'ffmemt__trd"_uuTs__e'ehddt",smmetfsr','.ssC,teexrihe,,mllaa"rnntieapo.tnsittFplrldireatp)i,ddiemeglo":essclpgoyp]l.'asoirz"dK:srsye,(e'itt,ry1:mr,"w,pDiAso0ooertnr,rcstoodtuikwFmicebiUemlnaesnpeilletozldr,re"(tr])f,}ireelgdisstry

上記の結果、以下のようなマッピングがOpenSearchに登録されました。

{"}us"}emra"}spp"pr"}"}"}"}iof,i,l,u:npi"d"a"s""}"gert"tstetf,a{srsyytyryi"}n"ttp:p_pnperai_eeneaela"l:en"{"a"m"dwtysames"yz{"m::e:":"pee":er:"""":":""ti:tt{{:ene{e{::xt{xx{tett"""g""khe,etrym"wlo_rsdt"rip"

username.rawを使用することで、ソートやアグリゲーションが可能となります。以下がviewsの例です。-を与えることで、降順になるようです。

#iffffffcmrrrrrrlspooooooaeommmmmmsarssd@ddrtdorrbbeoaeecjpeellPrcbffhaaessooaiuc/bnnttgggam.g"agtevcgs__..ileae"nerxioeffdsninbn"dtyce.arroeaztseT(:ewhraacrte_trhrsqsrprsrpprstcmmuiercraieeeereeetre.theemad_latstl=asisrtitpppwwelOcaceufrpnuiuEnuyyooniplst_mr,sc"otflarxtrirrtzeasmqeneh-n('tlnc(nmikksense_trlus*sieepm..rSs=tehaef=se*zsp)Hoppvisehxoq.e*=eettroaima=NopdQugsr=rlittrgepirodr(eeenFsfoptiwomcNnes)snlasoe=.nRHnsrphoeshtefmeulgetQatoAnsoe,r.eanfseasttirPeiuxad.rd.etsppimAtIolpqtorcpl_oRoprVndruecah{afpenenotAi(ee_uw.rg.a:ssriresbsrqm"eeisgepitctweesy_exsnei(omli(li)eneparnenpAecAfo:xtcotia,soPDlP,vnp_uneaterIoeIe.rcts_lestVcSVqr"eleeqidtiueiur"sa(.uz_aLemreei"ss)heertiweiwrdisirreumna,ydo.ty_ssitl)enssscp=t,iL:n(e.elo5Oziqattan0fUemuro(ss0fsriectrse)se,trhae((erOy(lsrstDUf)).peePosf.vosracesqanuigureulslaimSteuetlneePre,sianray},zttig(rei,aiqhemroln)iqa.nCia.tundazts(eyateioss=teror)tTag,nt,r)o)(furC:oveyari)Dteoeqwcgu=uoesmrreeyylnS:fte)r"i{aqluiezreyr}"')

まとめ

DjangoとAWS OpenSearchの接続にあたり、参考になりましたら幸いです。