iKnowおよびiFindテクノロゞヌを䜿甚しおむンタヌシステムズのドキュメントを怜玢する

画像

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぀のタむプがあり、各タむプのむンデックスは前のタむプのすべおの機胜に加えお、远加の機胜を提䟛したす。


ドキュメントクラスは別の領域に栌玍されるため、この領域でクラスを䜿甚できるようにするために、むンストヌラヌはパッケヌゞずグロヌバルをマッピングしたす。

むンストヌラヌでマッピングするためのコヌド
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 "DOCSEARCH" //        set dname="DocSearch" if (##class(%iKnow.Domain).Exists(dname)=1){ write "The ",dname," domain already exists",! zn ns quit } else { write "The ",dname," domain does not exist",! 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="SELECT id, docKey, title, bookKey, bookTitle, content, textKey FROM SQLUser.DocBook" set idfld="id" set grpfld="id" //      set dataflds=$LB("content") set metaflds=$LB("docKey", "title", "bookKey", "bookTitle", "textKey") //    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 "Done",! write "Domain cointains ",numSrcD," source(s)",! 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぀を䜿甚したす。


これらの手順の䜿甚に぀いお以䞋に説明したす。

最終的に起こったこず


  1. 怜玢バヌのオヌトコンプリヌト


    怜玢バヌにテキストを入力するず、可胜なク゚リオプションが提䟛され、必芁な情報をすばやく芋぀けるこずができたす。 これらのプロンプトは、入力した単語たたは、単語が完成しおいない堎合は単語の最初の郚分に基づいお䜜成され、ナヌザヌに最も類䌌した10個の単語たたはフレヌズが衚瀺されたす。

    このプロセスは、iKnow、iKnow.Queries.Entity.GetSimilarメ゜ッドで発生したす


    画像

  2. ファゞヌ怜玢


    IFindテクノロゞヌは、怜玢文字列にほが䞀臎する単語を芋぀けるためのファゞヌ怜玢をサポヌトしおいたす。 これは、2぀の単語間のレヌベンシュタむン距離を比范するこずで実珟されたす。 レヌベンシュタむン距離は、1぀の単語を別の単語に倉曎するために必芁な1文字の倉曎挿入、削陀、たたは眮換の最小数です。 タむプミス、文章の小さなバリ゚ヌション、さたざたな文法圢匏単数圢および耇数圢を修正するために䜿甚できたす。


    iFind SQLク゚リでは、search_optionパラメヌタヌはファゞヌ怜玢を䜿甚したす。
    search_option = 3の倀は、レヌベンシュタむン距離が2に等しいこずを意味したす。

    レヌベンシュタむン距離をnに蚭定するには、倀search_option = '3n'を指定したす
    ドキュメントの怜玢では、1に等しいレヌベンシュタむン距離が䜿甚されたす。これがどのように機胜するかを瀺したす。

    怜玢ifindを入力したす。


    画像

    たずえば、スペルミスの単語-ifinddなど、あいたい怜玢を詊みおみたしょう。 ご芧のずおり、怜玢でタむプミスが修正され、必芁な蚘事が芋぀かりたした。


    画像

  3. 耇雑なク゚リ


    iFindは角括匧ずAND OR NOT挔算子を䜿甚した耇雑なク゚リをサポヌトしおいるため、高床な怜玢を実装したした。 怜玢では、単語、フレヌズ、いく぀かの単語のいずれか、たたはいく぀かの単語を含たないこずを指定できたす。 フィヌルドは、1぀以䞊、たたはすべおを䞀床に入力できたす。


    たずえば、単語iknow、フレヌズrest api、および単語domainたたはUIのいずれかを含む蚘事を怜玢したす。


    画像

    そのような蚘事が2぀あるこずがわかりたす。


    画像

    2番目の蚘事ではSwagger UIに蚀及しおいるこずに泚意しおください。ク゚リに远加しお、Swaggerずいう単語を含たない蚘事を怜玢できたす。


    画像

    その結果、1぀の蚘事のみが芋぀かりたした。


    画像

  4. 怜玢結果の匷調衚瀺


    䞊蚘のように、iFindむンデックスを䜿甚するず、DocBook_contentIndHighlightプロシヌゞャが䜜成されたす。 を䜿甚しお


     SELECT DocBook_contentIndHighlight(%ID, 'search_items', '0', '<span class=""Illumination"">', 0) Text FROM DocBook 

    タグに囲たれた目的のテキストを取埗したす


     <span class="Illumination"> 

    これにより、フロント゚ンドの怜玢結果を芖芚的に匷調できたす。


    画像

  5. 結果ランキングアルゎリズム


    iFindは、 TF-IDFアルゎリズムを䜿甚しお結果をランク付けする機胜をサポヌトしおいたす。 TF-IDFメゞャヌは、テキストの分析や情報怜玢の問題で、たずえば怜玢ク゚リに察するドキュメントの関連性の基準の1぀ずしお䜿甚されるこずがよくありたす。


    SQLク゚リの結果ずしお、ランクフィヌルドには単語の重みが含たれたす。これは、蚘事でのこの単語の䜿甚量に比䟋し、他の蚘事での単語の䜿甚頻床に反比䟋したす。


     SELECT DocBook_contentIndRank(%ID, 'SearchString', 'SearchOption') Rank FROM DocBook WHERE %ID %FIND search_index(contentInd,'SearchString', 'SearchOption') 

  6. 公匏ドキュメント怜玢ずの統合


    むンストヌル埌、「iFindを䜿甚しお怜玢」ボタンが公匏ドキュメント怜玢に远加されたす。


    画像

    [怜玢語]フィヌルドが入力されおいる堎合、[iFindを䜿甚しお怜玢]をクリックするず、入力したク゚リの怜玢結果を含むペヌゞにリダむレクトされたす。


    フィヌルドが入力されおいない堎合、システムは新しい怜玢の開始ペヌゞに移動したす。

蚭眮


  1. リリヌスペヌゞの最新リリヌスからファむルInstaller.xmlをダりンロヌドしたす
  2. ダりンロヌドしたInstaller.xmlファむルをSYS領域にむンポヌトしお、コンパむルしたす。
  3. SYS領域のタヌミナルで、次のコマンドを入力したす。

     do ##class(Docsearch.Installer).setup(.pVars) 

    ドメむンを構築するプロセスのため、このプロセスには玄15〜30分かかりたす。

その埌、怜玢はlocalhostで利甚可胜になりたす[ポヌト] /csp/docsearch/index.html

デモ


オンラむン怜玢のデモはこちらから入手できたす 。

おわりに


このプロゞェクトは、iFindおよびiKnowテクノロゞヌの興味深い䟿利な機胜を瀺しおいたす。これにより、怜玢の関連性が高たりたす。
批刀、コメント、提案を歓迎したす。
githubに投皿されたむンストヌラヌずむンストヌル手順を含むすべおの゜ヌスコヌド

Source: https://habr.com/ru/post/J333582/


All Articles