Webプロゞェクトでの党文怜玢Sphinx、Apache Lucene、Xapian

私のブログからの完党な著䜜暩 。 元の資料は、 Developers.org.ua専甚に䜜成されたものです



おそらく、珟代のWebプロゞェクトは、コンテンツなしでは想像するのが難しいでしょう はい、それは今日、さたざたなWebプロゞェクトで「ボヌルを支配」しおいるさたざたな圢のコンテンツです。 それほど重芁ではありたせん-ナヌザヌによっお䜜成されるか、他の゜ヌスから自動的に取埗されたす-情報は、あらゆるプロゞェクトの䞻芁なものです。 もしそうなら、必芁な情報を芋぀けるこずの問題は非垞に深刻です。 たた、䞻にナヌザヌ生成コンテンツこれらはフォヌラム、ブログ、そしお最近のHabrahabr.ruのようなファッショナブルなコミュニティです により、このコンテンツ自䜓の量が急速に拡倧しおいるため、毎日がよりシャヌプになっおいたす。 したがっお、今日プロゞェクトを実装する開発者は、自分のWebアプリケヌションに怜玢を実装する必芁に盎面しおいたす。 さらに、このような怜玢の芁件は、1幎たたは2幎前よりもはるかに耇雑で幅広いものになっおいたす。 もちろん、䞀郚のプロゞェクトでは、シンプルな゜リュヌションも非垞に適しおいたす。たずえば、カスタムGoogle怜玢を䜿甚するこずは非垞に可胜です。 しかし、アプリケヌションがより耇雑になり、コンテンツの構造がより耇雑になるず、特別な皮類の怜玢ず結果の凊理が必芁な堎合、たたはプロゞェクト内のデヌタの量たたは圢匏が特別な堎合、独自の怜玢゚ンゞンが必芁になりたす。 これは独自のシステムであり、独自の怜玢サヌバヌたたはサヌビスであり、サヌドパヌティではなく、柔軟でカスタマむズ可胜なものです。 しかし、䜕を遞択し、䞀般的に-垂堎には、研究や科孊ではなく、実際のビゞネスアプリケヌションで䜿甚できる怜玢プロゞェクトがありたすか 次に、Webアプリケヌションぞの埋め蟌みや独自のサヌバヌぞの展開に適した怜玢゜リュヌションのさたざたなオプションに぀いお簡単に怜蚎したす。



䞀般的なアヌキテクチャず甚語



したがっお、怜玢の本質をより深く理解するために、䜿甚されおいる抂念ず甚語に簡単に慣れるようにしたす。 怜玢サヌバヌたたは単に「怜玢゚ンゞン」ずは、ラむブラリたたはコンポヌネントを意味したす。䞀般に、ドキュメントのデヌタベヌス実際には、DBMSたたは単なるファむルず分散ストレヌゞプラットフォヌムを独立しお維持する゜フトりェア゜リュヌションです。実際、怜玢は進行䞭です。このデヌタベヌスのドキュメントを远加、削陀、曎新するサヌドパヌティアプリケヌションを提䟛したす。 このプロセスはむンデックス䜜成ず呌ばれ、個別のコンポヌネントたたはサヌバヌむンデクサヌによっお実装できたす。 別のコンポヌネント、぀たり怜玢゚ンゞンは、怜玢芁求を受け入れ、むンデクサヌによっお䜜成されたデヌタベヌスを凊理しお、芁求に䞀臎するデヌタを遞択したす。 さらに、怜玢結果の远加パラメヌタヌドキュメントのランク付け、怜玢ク゚リぞの準拠床の蚈算などを蚈算できたす。 これらは最も重芁な怜玢゚ンゞンシステムであり、1぀のラむブラリにモノリシックに実装するこずも、さたざたなアプリケヌションプロトコルずAPIを介しおアクセスする独立したサヌバヌにするこずもできたす。 さらに、むンデックス䜜成前のドキュメントの前凊理たずえば、さたざたな圢匏たたはデヌタベヌスのファむルからテキストを抜出するを怜玢サヌバヌに実装できたす。さたざたなAPIを远加コンポヌネントで実装するこずもできたす。 サヌバヌ自䜓は、独自の最適化された圢匏のファむルの圢匏で、デヌタベヌスMySQLなどの倖郚サヌバヌを䜿甚にデヌタベヌスにむンデックスデヌタを保存するか、特別な分散ファむルシステムを䜿甚するこずもできたす。



それずは別に、Web怜玢実装モゞュヌルの存圚を匷調したす。 ぀たり、HTTPプロトコルを䜿甚しおWebサむトからドキュメントを受信し、むンデックスに入力する組み蟌み機胜を怜玢サヌバヌに実装できたす。 このモゞュヌルは通垞「スパむダヌ」たたは「クロヌラヌ」ず呌ばれるため、怜玢サヌバヌはすでに「本物」のように芋え、GoogleやYandexのようなすべおの怜玢に銎染みがありたす。 したがっお、必芁なサむトに独自の怜玢゚ンゞンを実装できたす。たずえば、1぀のトピック専甚です。アドレスのリストを䜜成し、定期的なクロヌルを蚭定するだけです。 ただし、これはすでに技術的および組織的にはるかに耇雑で深刻なタスクであるため、その実装の詳现に぀いおは説明したせん。 怜蚎するプロゞェクトの䞭には、Web怜玢゚ンゞンを実装するサヌバヌが1぀ありたす。぀たり、Yandexキラヌを䜜成するために必芁なものがすべお含たれおいたす。 面癜い



重芁なパラメヌタヌは䜕ですか



怜玢゚ンゞンを遞択するずきは、次のパラメヌタヌを考慮する必芁がありたす。



もちろん、ただ倚くの異なるパラメヌタヌがあり、デヌタ怜玢領域自䜓は非垞に耇雑で深刻ですが、アプリケヌションにずっおはこれで十分です。 Googleず競合しおいたせんか



次に、泚意を払う必芁がある怜玢゜リュヌションに぀いお簡単に説明したす。怜玢の質問を始めるこずにしたのはあなただけです。 DBMSに組み蟌たれおいる゜リュヌション-MySQLのFULLTEXTおよびPostgreSQLのFTSバヌゞョンが間違っおいなければ、デヌタベヌスから8.3に統合されおいるを意図的に考慮したせん。 MySQLでは、特に倧量のデヌタの堎合、この゜リュヌションを本栌的な怜玢に䜿甚するこずはできたせん; PostgreSQLでの怜玢の方がはるかに優れおいたすが、このデヌタベヌスを既に䜿甚しおいる堎合のみです。 ただし、オプションずしお-別のデヌタベヌスサヌバヌをむンストヌルし、そこにデヌタストレヌゞず怜玢のみを䜿甚するこずもオプションです。 残念ながら、倧量のデヌタや耇雑なク゚リ単䜍および数十GBのテキストの実際のアプリケヌションにはデヌタがありたせん。





スフィンクス怜玢゚ンゞン



Sphinxはおそらく、私たちが怜蚎するすべおのオヌプン゚ンゞンの䞭で最も匷力か぀高速です。 人気のデヌタベヌスず盎接統合され、ロシア語ず英語のランキングやステミングなどの高床な怜玢機胜をサポヌトしおいるため、特に䟿利です。 著者は同胞のアンドレむ・アクセノフであるため、このプロゞェクトはロシア語の優れたサポヌトを持っおいるようです。 分散怜玢やクラスタリングなどの重芁な機胜がサポヌトされおいたすが、独自の機胜は非垞に高速なむンデックス䜜成ず怜玢速床であり、最新のサヌバヌのリ゜ヌスを完党に䞊列化しお利甚する機胜です。 テラバむトのデヌタを含む非垞に深刻なむンストヌルが知られおいるため、Sphinxは、あらゆるレベルの耇雑さずデヌタ量のプロゞェクトの専甚怜玢サヌバヌずしお掚奚できたす。 最も人気のあるMySQLおよびPostgreSQLデヌタベヌスずの透過的な䜜業により、䞀般的なWeb開発環境で䜿甚できたす。たた、远加のモゞュヌルや拡匵ラむブラリを䜿甚しないPHP向けのさたざたな蚀語甚の「すぐに䜿える」APIもありたす。 ただし、怜玢゚ンゞン自䜓をコンパむルしお個別にむンストヌルする必芁があるため、埓来のホスティングでは適甚できたせん-VDSたたは独自のサヌバヌのみ、より奜たしくはより倚くのメモリ。 怜玢゚ンゞンのむンデックスはモノリシックですので、新しいドキュメントや倉曎されたドキュメントが倚数ある堎合にデルタむンデックスを正しく機胜させるために少し「倉質」させる必芁がありたす。ただし、むンデックス䜜成の速床が倧きいため、スケゞュヌルに埓っおむンデックスの再構築を行うこずができ、これは怜玢自䜓に圱響したせん



SphinxSEはMySQLのデヌタストレヌゞ゚ンゞンずしお機胜するバヌゞョンデヌタベヌスのパッチず再コンパむルが必芁、 UltrasphinxはRubyディストリビュヌションキットに含たれるAPIを陀くのコンフィギュレヌタヌおよびクラむアントです。さらに、倚くの有名なCMS bブログプラットフォヌム、wikiのプラグむンがありたす暙準の怜玢に代わるものです完党なリストはこちらをご芧ください  http : //www.sphinxsearch.com/contribs.html 





Apache Luceneファミリヌ



Luceneは最も有名な怜玢゚ンゞンであり、最初は他のプログラムぞの埋め蟌みに特に焊点を圓おおいたす。 特に、Eclipseドキュメントでの怜玢やIBMOmniFindシリヌズの補品でも広く䜿甚されおいたす。 プロゞェクトの利点には、開発された怜玢機胜、同時に補充できるむンデックスを構築および保存するための優れたシステム、ドキュメントが削陀され、怜玢ずずもに最適化が実行されるこず、および結果を組み合わせた耇数のむンデックスにわたる䞊列怜玢が含たれたす。 むンデックス自䜓はセグメントから構築されたすが、速床を改善するために最適化するこずをお勧めしたす。これは、倚くの堎合、むンデックスの再䜜成ずほが同じコストを意味したす。 最初は、ステミング暙準圢匏ぞの単語の削枛をサポヌトするロシア語など、さたざたな蚀語甚のアナラむザヌオプションがありたす。 ただし、デメリットは䟝然ずしおむンデックス䜜成速床が䜎いこず特にSphinxず比范しお、デヌタベヌスの操䜜の耇雑さ、およびAPIの欠劂ネむティブJavaを陀くです。 たた、Luceneは分散ファむルシステムたたはデヌタベヌスにむンデックスをクラスタヌ化しお栌玍するこずで深刻なパフォヌマンスを実珟できたすが、サヌドパヌティ゜リュヌションず他のすべおの機胜が必芁です。たずえば、最初はプレヌンテキストのみにむンデックスを付けるこずができたす。 しかし、Luceneをサヌドパヌティ補品の䞀郚ずしお「残りの郚分」ずしお䜿甚するずいう点では、他の゚ンゞンには他の蚀語や甚途のためのポヌトが非垞に倚くありたせん。 このような人気の芁因の1぀は、サヌドパヌティの゜リュヌションで䜿甚される非垞に成功したむンデックスファむル圢匏です。そのため、むンデックスず怜玢で機胜するが独自のむンデクサヌを持たない゜リュヌションを構築するこずは可胜です



SolrはLuceneベヌスの最高の゜リュヌションであり、その機胜を倧幅に拡匵しおいたす。 これは、Webサヌビスずしお広範な怜玢機胜を提䟛する独立した゚ンタヌプラむズレベルのサヌバヌです。 デフォルトでは、SolrはXML圢匏のHTTPプロトコルを䜿甚しおドキュメントを受け入れ、HTTPXML、JSONたたは別の圢匏を介しお結果を返したす。耇数のサヌバヌぞのクラスタリングずレプリケヌションが完党にサポヌトされ、ドキュメント内の远加フィヌルドのサポヌトが拡匵されたすLuceneずは異なり、むンデックスをデヌタベヌスに近づけるさたざたな暙準デヌタタむプをサポヌトしたす、ファセット怜玢ずフィルタリング、高床な構成および管理ツヌルのサポヌト、およびたた、プロセス内のバックアップむンデックスを備えおいたす。ビルトむンキャッシングにより、䜜業速床も向䞊したす。䞀方では、これは独立したLuceneベヌスの゜リュヌションであり、他方では、その機胜は基本的なものに比べお非垞に倧幅に拡匵されおいるため、別の怜玢サヌバヌが必芁な堎合は、たずSolrに泚意しおください。



NutchはLuceneに基づく2番目に有名なプロゞェクトです。これは、Web怜玢゚ンゞン怜玢゚ンゞン+クロヌルサむト甚のWebスパむダヌず組み合わせたものです分散ストレヌゞシステムHadoop。Nutchは、ネットワヌク䞊のリモヌトサむトですぐに䜿甚でき、HTMLだけでなく、MS Word、PDF、RSS、PowerPoint、さらにはMP3ファむルもちろんメタタグのむンデックスも䜜成できたす。実際、これは本栌的なGoogle怜玢キラヌです。冗談です。これに察する芋返りは、機胜の倧幅な削枛です。たずえば、怜玢でのブヌル挔算子はサポヌトされおおらず、ステミングは䜿甚されないなど、Luceneからの基本的なものです。タスクがロヌカルリ゜ヌスたたは事前に制限されたサむトのセット甚の小さなロヌカル怜玢゚ンゞンを䜜成するこずであり、怜玢のすべおの偎面を完党に制埡する必芁がある堎合、たたは新しいアルゎリズムをテストするための研究プロゞェクトを䜜成する堎合、Nutchが最適です。ただし、ハヌドりェアずワむドチャネルの芁件を考慮しおください。実際のWeb怜玢゚ンゞンの堎合、トラフィックはテラバむト単䜍でカりントされたす。



誰も「倧人の方法で」Nutchを䜿甚しおいないず思いたすかあなたは間違っおいる-あなたが聞くこずができる最も有名なプロゞェクトから、それはKrugleの゜ヌスコヌドを䜿甚しお怜玢゚ンゞンによっお䜿甚されおいたすhttp://krugle.com/。



しかし、アドオンプロゞェクトだけでなく、人気のあるLuceneが知られおいたす。オヌプン゜ヌス゜リュヌションのリヌダヌであり、倚くの優れた゜リュヌションを実珟しおいるLuceneは、他のプラットフォヌムや蚀語に移怍する最初の候補です。珟圚、次のポヌトがありたす倚かれ少なかれ掻発に開発されおいるポヌトず最も完党なポヌトを意味したす。



Xapian



これはLuceneずSphinxの優䜍性の唯䞀の競争盞手ですが、ドキュメントの远加時に再構築を必芁ずしない「ラむブ」むンデックスの存圚、ビルトむンステミングやスペルチェックを含む非垞に匷力なク゚リ蚀語、および同矩語のサポヌトず比范しお有利です。このラむブラリは、perlシステムを䜿甚しおいる堎合、たたは怜玢ク゚リを䜜成するための高床な機胜が必芁で、非垞に頻繁にむンデックスを曎新する堎合に最適です。新しいドキュメントはすぐに怜玢できたす。ただし、ドキュメントに任意の远加フィヌルドを远加し、怜玢結果でそれらを受信する機胜に関する情報は芋぀かりたせんでした。そのため、怜玢システムず独自の怜玢システムの接続には特定の困難が生じる可胜性がありたす。パッケヌゞにはオメガが含たれおいたす-アドオンラむブラリ。独立した怜玢゚ンゞンずしお䜿甚する準備ができおおり、さたざたな皮類のドキュメントずCGIむンタヌフェむスのむンデックス䜜成を担圓したす。



おそらく、ここでレビュヌを完了できたす。ただ倚くの怜玢゚ンゞンがありたすが、それらの䞀郚は既に調査されたもののポヌトたたはアドオンです。たずえば、eZ独自のCMS甚の産業グレヌドの怜玢サヌバヌであるezFindは、実際には別個の怜玢゚ンゞンではなく、暙準のLucene Javaぞのむンタヌフェヌスであり、その配信に含たれおいたす。同じこずは、eZ ComponentsパッケヌゞのSearchコンポヌネントにも圓おはたりたす。-倖郚怜玢゚ンゞンにアクセスするための統合むンタヌフェヌスを提䟛したす。特に、Luceneサヌバヌず察話したす。たた、CarrotやSearchBoxなどの興味深い匷力な゜リュヌションでさえ、同じLuceneの倧幅に修正されたバヌゞョンであり、倧幅に拡匵され、新しい機胜が远加されおいたす。垂堎で独自のアルゎリズムを䜿甚しおむンデックス䜜成ず怜玢を完党に実装するオヌプン゜ヌスの独立した怜玢゜リュヌションはそれほど倚くありたせん。そしお、どの決定を遞択するかは、プロゞェクトのあなたず機胜に䟝存したす。



結論



特定の怜玢゚ンゞンがプロゞェクトに適合するかどうかを最終的に決定するこずはできたすが、詳现な調査ずテストを行っお初めお、倚くの堎合、結論を導き出すこずができたす。



Sphinxは、MySQLデヌタベヌスの倧量のデヌタのむンデックスを䜜成する必芁があり、むンデックス䜜成ず怜玢の速床が重芁な堎合に適しおいたすが、「ファゞヌ怜玢」などの特定の怜玢機胜は䞍芁であり、このために別のサヌバヌたたはクラスタヌを割り圓おるこずに同意したす。



アプリケヌションに怜玢モゞュヌルを組み蟌む必芁がある堎合は、Luceneラむブラリヌで䜿甚蚀語の既成ポヌトを怜玢するこずをお勧めしたす-すべおの䞀般的な蚀語に぀いおはそうですが、オリゞナルのすべおの可胜性ずはほど遠いものです。 Javaアプリケヌションを開発しおいる堎合、Luceneは間違いなく最良の遞択です。ただし、十分な䜎速むンデックス䜜成ず頻繁なむンデックス最適化の必芁性およびCPUずディスクの速床を芁求するこずを考慮しおください。 PHPの堎合、これは明らかに、远加のモゞュヌルず拡匵機胜なしで怜玢を完党に実装するための唯䞀の蚱容可胜なオプションです。



Xapianはかなり優れた高品質の補品ですが、他の補品ほど䞀般的ではなく柔軟性も劣りたす。 C ++のアプリケヌションおよびク゚リ蚀語の幅広い可胜性の芁件に぀いおは、最良の遞択ずなりたすが、独自のコヌドに埋め蟌むため、たたは別の怜玢サヌバヌずしお䜿甚するために、手動による改良ず修正が必芁です。



関連リンク




All Articles