
InterSystemsCachéDBMSã«ã¯ãéæ§é åiKnowããŒã¿ãæäœããããã®çµã¿èŸŒã¿æè¡ãšãiFindå
šææ€çŽ¢æè¡ããããŸãã ç§ãã¡ã¯ãã¯ãããžãŒãæ±ããšåæã«ãäœã圹ã«ç«ã€ããšãããããšã«ããŸããã çµæã¯ãiKnowããã³iFindãã¯ãããžãŒã䜿çšããŠ
ã€ã³ã¿ãŒã·ã¹ãã ãºã®ããã¥ã¡ã³ããæ€çŽ¢ããããã®Webã¢ããªã±ãŒã·ã§ã³ã§ããDocSearchã§ãã
Cachéã§ã®ããã¥ã¡ã³ãã®åäœ
Cachéã®ããã¥ã¡ã³ãã¯ã
Docbookãã¯ãããžã«åºã¥ããŠ
ããŸãã ããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããããã®
Webã€ã³ã¿ãŒãã§ã€ã¹ãæäŸãããŠããŸãïŒiFindãŸãã¯iKnowã䜿çšããªãæ€çŽ¢ãå«ãïŒã å®éãããã¥ã¡ã³ãèšäºã®ããŒã¿ã¯Cachéã¯ã©ã¹ã«ãããŸããããã«ããããããã®ããŒã¿ãåå¥ã«ç
§äŒããããšãã§ããããã«å¿ããŠç¬èªã®æ€çŽ¢ãŠãŒãã£ãªãã£ãäœæããããšãã§ããŸãã
iKnowãšiFindãšã¯äœã§ããïŒ
Intersystems iKnowã¯ãããã¹ãã«å«ãŸããæãšãšã³ãã£ãã£ã«ã€ã³ããã¯ã¹ãä»ããããšã§ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããéæ§é åããŒã¿åæããŒã«ã§ãã åæãéå§ããã«ã¯ãéæ§é åããŒã¿ã®ãªããžããªã§ãããã¡ã€ã³ãäœæããããã«ããã¹ããããŒãããå¿
èŠããããŸãã ãã¡ã€ã³ãäœæããããã»ã¹ã¯ã ãããšããã§è©³ãã説æãããŠããŸã ã iKnowã®åºæ¬çãªäœ¿ç𿹿³ã¯ããã«èšèŒãããŠããŸãã ãã®èšäºããå§ãããŸãã
IFindãã¯ãããžã¯ãCachéã¯ã©ã¹ã«åºã¥ããŠå
šææ€çŽ¢ãå®è¡ããããã®CachéDBMSã¢ãžã¥ãŒã«ã§ãã iFindã¯ãiKnowã®å€ãã®æ©èœã䜿çšããŠãã€ã³ããªãžã§ã³ããªããã¹ãæ€çŽ¢ãæäŸããŸãã ã¯ãšãªã§iFindã䜿çšããã«ã¯ãCachéã¯ã©ã¹ã§ç¹å¥ãªiFindã€ã³ããã¯ã¹ãèšè¿°ããå¿
èŠããããŸãã
iFindã€ã³ããã¯ã¹ã«ã¯3ã€ã®ã¿ã€ãããããåã¿ã€ãã®ã€ã³ããã¯ã¹ã¯åã®ã¿ã€ãã®ãã¹ãŠã®æ©èœã«å ããŠã远å ã®æ©èœãæäŸããŸãã
- ã¡ã€ã³ã€ã³ããã¯ã¹ïŒïŒ
iFind.Index.BasicïŒïŒèªå¥ã®æ€çŽ¢ããµããŒãããŸãã
- ã»ãã³ãã£ãã¯ã€ã³ããã¯ã¹ïŒïŒ
iFind.Index.SemanticïŒïŒiKnowãªããžã§ã¯ãã®æ€çŽ¢ããµããŒãããŸãã
- åæã€ã³ããã¯ã¹ïŒïŒ
iFind.Index.AnalyticïŒïŒã»ãã³ãã£ãã¯ã€ã³ããã¯ã¹å
ã®ãã¹ãŠã®iKnow颿°ãããã³åèªã®ãã¹ãšè¿æ¥æ§ã«é¢ããæ
å ±ããµããŒãããŸãã
ããã¥ã¡ã³ãã¯ã©ã¹ã¯å¥ã®é åã«æ ŒçŽãããããããã®é åã§ã¯ã©ã¹ã䜿çšã§ããããã«ããããã«ãã€ã³ã¹ããŒã©ãŒ
ã¯ããã±ãŒãžãšã°ããŒãã«ã
ãããã³ã°ããŸãã
ã€ã³ã¹ããŒã©ãŒã§ãããã³ã°ããããã®ã³ãŒãXData Install [ XMLNamespace = INSTALLER ] { <Manifest> // <IfNotDef Var="Namespace"> <Var Name="Namespace" Value="DOCSEARCH"/> <Log Text="Set namespace to ${Namespace}" Level="0"/> </IfNotDef> // <If Condition='(##class(Config.Namespaces).Exists("${Namespace}")=1)'> <Log Text="Namespace ${Namespace} already exists" Level="0"/> </If> // <If Condition='(##class(Config.Namespaces).Exists("${Namespace}")=0)'> <Log Text="Creating namespace ${Namespace}" Level="0"/> // <Namespace Name="${Namespace}" Create="yes" Code="${Namespace}" Ensemble="" Data="${Namespace}"> <Log Text="Creating database ${Namespace}" Level="0"/> // <Configuration> <Database Name="${Namespace}" Dir="${MGRDIR}/${Namespace}" Create="yes" MountRequired="false" Resource="%DB_${Namespace}" PublicPermissions="RW" MountAtStartup="false"/> <Log Text="Mapping DOCBOOK to ${Namespace}" Level="0"/> <GlobalMapping Global="Cache*" From="DOCBOOK" Collation="5"/> <GlobalMapping Global="D*" From="DOCBOOK" Collation="5"/> <GlobalMapping Global="XML*" From="DOCBOOK" Collation="5"/> <ClassMapping Package="DocBook" From="DOCBOOK"/> <ClassMapping Package="DocBook.UI" From="DOCBOOK"/> <ClassMapping Package="csp" From="DOCBOOK"/> </Configuration> <Log Text="End creating database ${Namespace}" Level="0"/> </Namespace> <Log Text="End creating namespace ${Namespace}" Level="0"/> </If> </Manifest> }
iKnowã«å¿
èŠãªãã¡ã€ã³ã¯ãããã¥ã¡ã³ããå«ãããŒãã«äžã«æ§ç¯ãããŠããŸãã ããŒã¿ãœãŒã¹ã¯ããŒãã«ãªã®ã§ãSQL.Listerã䜿çšããŸãã ã³ã³ãã³ããã£ãŒã«ãã«ã¯ããã¥ã¡ã³ãã®ããã¹ããå«ãŸããŠãããããããŒã¿ãã£ãŒã«ããšããŠç€ºããŸãã æ®ãã®ãã£ãŒã«ãã¯ã¡ã¿ããŒã¿ã«ç€ºãããŸãã
ã€ã³ã¹ããŒã©ãŒã®ãã¡ã€ã³äœæã³ãŒã ClassMethod Domain(ByRef pVars, pLogLevel As %String, tInstaller As %Installer.Installer) As %Status { #Include %IKInclude #Include %IKPublic set ns = $Namespace znspace // set dname= if (##class(%iKnow.Domain).Exists(dname)=1){ write ,dname,,! zn ns quit } else { write ,dname,,! set domoref=##class(%iKnow.Domain).%New(dname) do domoref.%Save() } set domId=domoref.Id // Lister , set flister=##class(%iKnow.Source.SQL.Lister).%New(domId) set myloader=##class(%iKnow.Source.Loader).%New(domId) // set myquery= set idfld= set grpfld= // set dataflds=$LB() set metaflds=$LB(, , , , ) // Lister set stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds,metaflds) if stat '= 1 {write "The lister failed: ",$System.Status.DisplayError(stat) quit } // set stat=myloader.ProcessBatch() if stat '= 1 { quit } set numSrcD=##class(%iKnow.Queries.SourceQAPI).GetCountByDomain(domId) write ,! write ,numSrcD,,! zn ns quit }
ããã¥ã¡ã³ããæ€çŽ¢ããã«ã¯ãïŒ
iFind.Index.Analyticã€ã³ããã¯ã¹ã䜿çšããŸãã
Index contentInd On (content) As %iFind.Index.Analytic(LANGUAGE = "en", LOWER = 1, RANKERCLASS = "%iFind.Rank.Analytic");
ããã§ãcontentIndã¯ã€ã³ããã¯ã¹ã®ååãcontentã¯ã€ã³ããã¯ã¹ãäœæãããã£ãŒã«ãã®ååã§ãã
ãã©ã¡ãŒã¿ãŒLANGUAGE = "en"ã¯ãããã¹ããæžãããŠããèšèªã瀺ããŸã
ãã©ã¡ãŒã¿ãŒLOWER = 1ã«ããã倧æåãšå°æåãåºå¥ããªãããã«èšå®ããŸã
ãã©ã¡ãŒã¿ãŒRANKERCLASS = "ïŒ
iFind.Rank.Analytic"ãTF
-IDFã©ã³ãã³ã°ã¢ã«ãŽãªãºã ã䜿çšã§ããŸãã
ãã®ãããªã€ã³ããã¯ã¹ã远å ããã³æ§ç¯ããåŸãããšãã°SQLã¯ãšãªã§äœ¿çšã§ããŸãã SQLã§iFindã䜿çšããããã®äžè¬çãªæ§æã¯æ¬¡ã®ãšããã§ãã
SELECT * FROM TABLE WHERE %ID %FIND search_index(indexname,'search_items',search_option)
ãã®ãããªãã©ã¡ãŒã¿ã䜿çšããŠïŒ
iFind.Index.Analyticã€ã³ããã¯ã¹ãäœæãããšã次ã®åœ¢åŒã®ããã€ãã®SQLããã·ãŒãžã£ãäœæãããŸã-[ããŒãã«å] _ [ã€ã³ããã¯ã¹å]ããã·ãŒãžã£å
ãã®ãããžã§ã¯ãã§ã¯ããã®ãã¡ã®2ã€ã䜿çšããŸãã
- DocBook_contentIndRank-ãªã¯ãšã¹ãã®TF-IDFã©ã³ãã³ã°ã¢ã«ãŽãªãºã ã®çµæãè¿ããŸã
æ§æã¯æ¬¡ã®ãšããã§ãã
SELECT DocBook_contentIndRank(%ID, 'SearchString', 'SearchOption') Rank FROM DocBook WHERE %ID %FIND search_index(contentInd,'SearchString', 'SearchOption')
- DocBook_contentIndHighlight-æ€çŽ¢çµæãè¿ããŸããæ€çŽ¢ã¯ãŒãã¯æå®ãããã¿ã°ã§å²ãŸããŠããŸãã
SELECT DocBook_contentIndHighlight(%ID, 'SearchString', 'SearchOption','Tags') Text FROM DocBook WHERE %ID %FIND search_index(contentInd,'SearchString', 'SearchOption')
ãããã®æé ã®äœ¿çšã«ã€ããŠä»¥äžã«èª¬æããŸãã
æçµçã«èµ·ãã£ãããšïŒ
æ€çŽ¢ããŒã®ãªãŒãã³ã³ããªãŒã
æ€çŽ¢ããŒã«ããã¹ããå
¥åãããšãå¯èœãªã¯ãšãªãªãã·ã§ã³ãæäŸãããå¿
èŠãªæ
å ±ããã°ããèŠã€ããããšãã§ããŸãã ãããã®ããã³ããã¯ãå
¥åããåèªïŒãŸãã¯ãåèªã宿ããŠããªãå Žåã¯åèªã®æåã®éšåïŒã«åºã¥ããŠäœæããããŠãŒã¶ãŒã«æãé¡äŒŒãã10åã®åèªãŸãã¯ãã¬ãŒãºã衚瀺ãããŸãã
ãã®ããã»ã¹ã¯ãiKnowãïŒ
iKnow.Queries.Entity.GetSimilarã¡ãœããã§çºçããŸã

ãã¡ãžãŒæ€çŽ¢
IFindãã¯ãããžãŒã¯ãæ€çŽ¢æååã«ã»ãŒäžèŽããåèªãèŠã€ããããã®ãã¡ãžãŒæ€çŽ¢ããµããŒãããŠããŸãã ããã¯ã2ã€ã®åèªéã®ã¬ãŒãã³ã·ã¥ã¿ã€ã³è·é¢ãæ¯èŒããããšã§å®çŸãããŸãã ã¬ãŒãã³ã·ã¥ã¿ã€ã³è·é¢ã¯ã1ã€ã®åèªãå¥ã®åèªã«å€æŽããããã«å¿
èŠãª1æåã®å€æŽïŒæ¿å
¥ãåé€ããŸãã¯çœ®æïŒã®æå°æ°ã§ãã ã¿ã€ããã¹ãæç« ã®å°ããªããªãšãŒã·ã§ã³ãããŸããŸãªææ³åœ¢åŒïŒåæ°åœ¢ããã³è€æ°åœ¢ïŒãä¿®æ£ããããã«äœ¿çšã§ããŸãã
iFind SQLã¯ãšãªã§ã¯ãsearch_optionãã©ã¡ãŒã¿ãŒã¯ãã¡ãžãŒæ€çŽ¢ã䜿çšããŸãã
search_option = 3ã®å€ã¯ãã¬ãŒãã³ã·ã¥ã¿ã€ã³è·é¢ã2ã«çããããšãæå³ããŸãã
ã¬ãŒãã³ã·ã¥ã¿ã€ã³è·é¢ãnã«èšå®ããã«ã¯ãå€search_option = '3ïŒn'ãæå®ããŸã
ããã¥ã¡ã³ãã®æ€çŽ¢ã§ã¯ã1ã«çããã¬ãŒãã³ã·ã¥ã¿ã€ã³è·é¢ã䜿çšãããŸãããããã©ã®ããã«æ©èœãããã瀺ããŸãã
æ€çŽ¢ifindãå
¥åããŸãã

ããšãã°ãã¹ãã«ãã¹ã®åèª-ifinddãªã©ããããŸãæ€çŽ¢ã詊ã¿ãŠã¿ãŸãããã ã芧ã®ãšãããæ€çŽ¢ã§ã¿ã€ããã¹ãä¿®æ£ãããå¿
èŠãªèšäºãèŠã€ãããŸããã

è€éãªã¯ãšãª
iFindã¯è§æ¬åŒ§ãšAND OR NOTæŒç®åã䜿çšããè€éãªã¯ãšãªããµããŒãããŠãããããé«åºŠãªæ€çŽ¢ãå®è£
ããŸããã æ€çŽ¢ã§ã¯ãåèªããã¬ãŒãºãããã€ãã®åèªã®ããããããŸãã¯ããã€ãã®åèªãå«ãŸãªãããšãæå®ã§ããŸãã ãã£ãŒã«ãã¯ã1ã€ä»¥äžããŸãã¯ãã¹ãŠãäžåºŠã«å
¥åã§ããŸãã
ããšãã°ãåèªiknowããã¬ãŒãºrest apiãããã³åèªdomainãŸãã¯UIã®ãããããå«ãèšäºãæ€çŽ¢ããŸãã

ãã®ãããªèšäºã2ã€ããããšãããããŸãã

2çªç®ã®èšäºã§ã¯Swagger UIã«èšåããŠããããšã«æ³šæããŠãã ãããã¯ãšãªã«è¿œå ããŠãSwaggerãšããåèªãå«ãŸãªãèšäºãæ€çŽ¢ã§ããŸãã

ãã®çµæã1ã€ã®èšäºã®ã¿ãèŠã€ãããŸããã

æ€çŽ¢çµæã®åŒ·èª¿è¡šç€º
äžèšã®ããã«ãiFindã€ã³ããã¯ã¹ã䜿çšãããšãDocBook_contentIndHighlightããã·ãŒãžã£ãäœæãããŸãã ã䜿çšããŠïŒ
SELECT DocBook_contentIndHighlight(%ID, 'search_items', '0', '<span class=""Illumination"">', 0) Text FROM DocBook
ã¿ã°ã«å²ãŸããç®çã®ããã¹ããååŸããŸã
<span class="Illumination">
ããã«ãããããã³ããšã³ãã®æ€çŽ¢çµæãèŠèŠçã«åŒ·èª¿ã§ããŸãã

çµæã©ã³ãã³ã°ã¢ã«ãŽãªãºã
iFindã¯ã TF-IDFã¢ã«ãŽãªãºã ã䜿çšããŠçµæãã©ã³ã¯ä»ãããæ©èœããµããŒãããŠããŸãã TF-IDFã¡ãžã£ãŒã¯ãããã¹ãã®åæãæ
å ±æ€çŽ¢ã®åé¡ã§ãããšãã°æ€çŽ¢ã¯ãšãªã«å¯Ÿããããã¥ã¡ã³ãã®é¢é£æ§ã®åºæºã®1ã€ãšããŠäœ¿çšãããããšããããããŸãã
SQLã¯ãšãªã®çµæãšããŠãã©ã³ã¯ãã£ãŒã«ãã«ã¯åèªã®éã¿ãå«ãŸããŸããããã¯ãèšäºã§ã®ãã®åèªã®äœ¿çšéã«æ¯äŸããä»ã®èšäºã§ã®åèªã®äœ¿çšé »åºŠã«åæ¯äŸããŸãã
SELECT DocBook_contentIndRank(%ID, 'SearchString', 'SearchOption') Rank FROM DocBook WHERE %ID %FIND search_index(contentInd,'SearchString', 'SearchOption')
å
¬åŒããã¥ã¡ã³ãæ€çŽ¢ãšã®çµ±å
ã€ã³ã¹ããŒã«åŸããiFindã䜿çšããŠæ€çŽ¢ããã¿ã³ãå
¬åŒããã¥ã¡ã³ãæ€çŽ¢ã«è¿œå ãããŸãã

[æ€çŽ¢èª]ãã£ãŒã«ããå
¥åãããŠããå Žåã[iFindã䜿çšããŠæ€çŽ¢]ãã¯ãªãã¯ãããšãå
¥åããã¯ãšãªã®æ€çŽ¢çµæãå«ãããŒãžã«ãªãã€ã¬ã¯ããããŸãã
ãã£ãŒã«ããå
¥åãããŠããªãå Žåãã·ã¹ãã ã¯æ°ããæ€çŽ¢ã®éå§ããŒãžã«ç§»åããŸãã
èšçœ®
- ãªãªãŒã¹ããŒãžã®ææ°ãªãªãŒã¹ãããã¡ã€ã«Installer.xmlãããŠã³ããŒãããŸã
- ããŠã³ããŒãããInstaller.xmlãã¡ã€ã«ãïŒ
SYSé åã«ã€ã³ããŒãããŠãã³ã³ãã€ã«ããŸãã
- ïŒ
SYSé åã®ã¿ãŒããã«ã§ã次ã®ã³ãã³ããå
¥åããŸãã
do ##class(Docsearch.Installer).setup(.pVars)
ãã¡ã€ã³ãæ§ç¯ããããã»ã¹ã®ããããã®ããã»ã¹ã«ã¯çŽ15ã30åããããŸãã
ãã®åŸãæ€çŽ¢ã¯
localhostã§å©çšå¯èœã«ãªããŸãïŒ[ããŒã] /csp/docsearch/index.html
ãã¢
ãªã³ã©ã€ã³æ€çŽ¢ã®ãã¢ã¯
ãã¡ãããå
¥æã§ã
ãŸã ã
ãããã«
ãã®ãããžã§ã¯ãã¯ãiFindããã³iKnowãã¯ãããžãŒã®è峿·±ã䟿å©ãªæ©èœã瀺ããŠããŸããããã«ãããæ€çŽ¢ã®é¢é£æ§ãé«ãŸããŸãã
æ¹å€ãã³ã¡ã³ããææ¡ãæè¿ããŸãã
githubã«æçš¿ãããã€ã³ã¹ããŒã©ãŒãšã€ã³ã¹ããŒã«æé ãå«ããã¹ãŠã®ãœãŒã¹ã³ãŒã