組み蟌みのスフィンクス、たたはルヌタヌで怜玢

Sphinx怜玢゚ンゞンsphinxsearchは、高負荷および倧芏暡なむンデックスボリュヌムに非垞にうたく察応できるシステムずしお䜍眮付けられおいたす。 䞀般に、これは悪いこずではありたせんが、16コアプロセッサず256GBのRAMを備えたマシンが手元にない堎合がありたす。 しかし、コアが1぀だけの堎合はどうでしょうか。 そしお、メモリの量ではない堎合は そしお、これがサヌバヌや平均的なPCでさえなく、䞀般的なSoCルヌタヌであり、最速の「ストヌン」からは遠く、どこに32 MBのRAMがあり、それでも他のプロセスやシステムず共有する必芁がある堎合 この堎合、怜玢゚ンゞンは起動したすか 機胜したすか それは正圓化されたすか

はい、離陞したす。 はい、動䜜したす。 はい、それは正圓化されたす。





背景
私は1぀の小さなトレヌニングラむブラリで働いおいたす。 いいえ、これは.dllたたは.soファむルではありたせんが、最も䞀般的なのは棚ずたくさんの本、玄3䞇の郚屋です。 図曞通は20幎前でもありたせん。 か぀おは数ラックから始たり、数十冊の本しかなく、それらはすべおよく知られおいたした。 それから図曞通は発展し始め、本はたすたす倚くなりたした。 叀い郚屋には圌らのための堎所がなく、移動が行われたした。 圓時、私がそこで働き始めたずき、基金には玄15,000冊の本より公匏には「ストレヌゞナニット」があり、すべおの棚のすべおの棚の党長は1キロに近づいおいたした。

しかし...いや、それは図曞通ではありたせんでした。 巚倧なダンプでした

あいたいな暙識に関する本は、異なる棚に配眮されたした。 「公匏の」ラむブラリ管理システムは䜿甚されず、すべおが「ひざたずき」に行われたした。 私はこのダンプず「デヌタベヌス」を継承したした。MSAccessファむルでは、すべおがすべお誇らしげに誇らしげに衚されおいたす同じ成功で、Excelテヌブルたたは単語のリストの圢で存圚するこずもできたす-デヌタベヌス」は、正芏化やテヌブル内のテヌブル間の関係などの機胜であり、少なくずもそうではありたせんでした。 本を取り、読者は圌の姓ず本の名前を裏打ち圢匏で曞かなければなりたせんでした。

「ベヌス」内の曞籍の怜玢は、テヌブルを開いおCtrl + Fを抌すこずで実行されたした。

「ダンプ」での実際の本の怜玢...ああ、それが䞻な仕事でした。 盎接怜玢、cho ...数か月の䜜業の埌、特定の本をどこで探すべきか既に考えおいたしたが、これはプロセスを少しだけ加速したした。 結局、この無意味なレッスンは私を悩たせ、私は「すべお」のリメむクを始めたした。

箄1幎埌ほずんどの堎合、曞籍の圚庫に盎接行きたした、すべおの「ストレヌゞナニット」に番号が付けられ、バヌコヌドが装備され、特定の棚に結び付けられた、きちんずした基盀を埗たした。 曞籍の発行は、デヌタベヌス内の曞籍を怜玢しお、どの棚にあったかを確認し、曞籍番号バヌコヌドからスキャナヌでを読者の仮想カヌドに入力するだけになりたした。 送信は再びバヌコヌドのスキャンであり、その埌、曞籍はリヌダヌのカヌドから自動的に削陀され、デヌタベヌスは芪切に特定の棚に眮くこずを申し出たす。 äžž1日かかっおいたレッスンに数分かかるようになりたした。 やった

次は デヌタベヌスを正芏化したすか はい、できたした。

ああ さお、MS Accessから「もっず無料の」゜フトりェアにドラッグしおください。 OK、完了、mysqlにドラッグアンドドロップしたす。 元のデヌタベヌスは圱響を受けたせんでした-ODBCドラむバヌをむンストヌルし、内郚テヌブルを珟圚の倖郚テヌブルに眮き換えただけです。

読者が本を芋぀けるのを止めるものは䜕もありたせん これたでは誰も干枉しおいたせんでした-しかし、これは.mdbデヌタベヌスのコピヌを䜜成し、そこから機密デヌタをリストや配垃されたもののように削陀し、それをアヌカむブの圢でそれを望んでいる人に配垃するこずによっお行われたした。 ...。 最もシンプルな怜玢フォヌムを備えた控えめなphpアプリケヌションがデヌタベヌスに割り圓おられたした。今では、曞籍を怜玢する必芁さえありたせん:)。 読者は自分でそれらを芋぀け、芋぀かった棚からそれを取り出しお、コヌドをスキャンしお手に入れるためだけに私に持っお行きたす。 䜜業ロボット、幞せな男

費甚はいくらですか それでは、ベヌス、フォヌム、怜玢-完党なLAMPSスタック= LAMP + S [phinx]、すべおが倖郚IPを備えたホヌムデスクトップ䞊で回転しおいたす。

信頌できない

さお、手攟したす。 結局のずころ、これは囜の半分のリアルタむム取匕サヌビスの銀行サむトではありたせん。

しかし、いたいたしい、24時間幎䞭無䌑のコンピュヌタヌは電気も消費したす。 そしお、それはノむズを䜜りたす...そしお、あなたがそれに぀いお考えるならば、それから図曞通サむトのほかに、それを絶えずそれを保ち続ける他の理由がありたす





ルヌタヌを䜿甚するずどうなりたすか



叀いルヌタヌDI-624の定期的なハングに完党に飜き飜きしお、WRT-160NLに倉曎したずきがきたした。 私はむンタヌネットを感じ、新機胜の説明を怜玢したした...そしお翌日、ストックファヌムりェアをdd-wrtに眮き換えたした。 倖付けのhddであるshamanilを拟い䞊げ、控えめなNASファむルのりォッシュを行いたした。 圌はむンタヌネット䞊で倧隒ぎし、オプトりェアに぀いお読み、それを詊しおみたした-そしお、同じ倖郚hddで、ルヌタヌ自䜓のために远加の゜フトりェアがすでに巻き䞊げられおいたした。 送信-お願い; lighttpd-簡単 php 問題ありたせん うヌん...図曞通サむトは離陞したすか はい、離陞したした。 そしお、もし圌のmysqlベヌスをルヌタヌに盎接入れたら わあ、わかった 確かに、mysqlビルドはかなり耇雑です。 テヌブルからのみMyISAM-しかし、それでも動䜜したす



怜玢はどうですか


さお、これは出おきおいたす-ルヌタヌ自䜓は珟圚トレントをダりンロヌドしおいたす。 ファむルクリヌニングずそれが提䟛するサむトさえも...足りない唯䞀のものはスフィンクス怜玢です。 デスクトップ䞊でただ回転しおいたす。 そしお、圌がルヌタヌに乗ったらどうなりたすか..

はい それが刀明したように-それが開始しようずしおいる、それは動䜜したす。 うたくいきたす

埌にルヌタヌをAsus RT-N16に倉曎し、珟圚はNetGear WNDR-4300に倉曎したした。 ファヌムりェアをdd-wrtからopenwrtに倉曎したした。 しかし、スフィンクスはただ生き続けおいたす。



ルヌタヌ甚に゜フトりェアを組み立おる方法は



もちろん、コン゜ヌルずスクリプトを収集する機胜があれば、さたざたな方法でプログラムを䜜成できたす。 それらのいく぀かは非垞に頑固です。 ./configure && make && make installを䜿甚しお、debたたはrpmベヌスのディストリビュヌションの゜ヌスからプログラムをむンストヌルする方法に぀いお説明したす。アセンブルしお、起動するこずもできたす。 したがっお、より文明化された方法が䜿甚されたす。 ルヌタヌ甚の2぀のビルド/公開システムを扱っおいたした。 それらに぀いお説明したす。



オプトりェア


サヌドパヌティのファヌムりェア甚の代替゜フトりェアの知識は、それから始たりたした。

芁するに、 optwareは/ optブランチに完党に集䞭しおいる゜フトりェアです。 したがっお、名前。 たずえば、optwareにむンストヌルされたデヌモンは/ opt / usr / sbinのどこかにあり、共有ラむブラリは/ opt / usr / libにドロップされ、構成は/ opt / etcで埅機し、起動スクリプトは/ opt / etcにスロヌされたす。 /init.d。 タヌゲットシステムに4 MBのフラッシュメモリしかない堎合、誰もがファヌムりェアで詰たっおいる-それは問題ではありたせん 別の堎所から他の方法でマりント/オプトする必芁がありたす-そしお私たちはチョコレヌトの䞭にいたす オプトりェアをむンストヌルしお䜜業できたす この他の堎所は、たずえば、倖郚フラッシュドラむブ既存のusbポヌトに挿入です。 たたは、プログラムで制埡できる状態たずえば、電源、アクティビティ、出力甚のステヌタスLED、入力甚のwpsおよびリセットボタンなどがルヌタヌ内のすべおの接点に「膝䞊」ではんだ付けされたSDカヌドです。別のMK-指定された連絡先を必芁な順序で「点滅」させ、SPIバスの動䜜を瀺し、「ボタンを抌す」を読み取りたす。SDカヌドはこれを理解しおいるため、その内容に文字通り「 LEDずボタンを通じお 」アクセスできたす。 さお、たたはSMBプロトコルを䜿甚しおWindowsを実行しおいるルヌタヌにマりントされた倖郚ネットワヌクFSでさえもです。 確かに、この堎合、サヌビスを完党にサヌビスできる小さなスタンドアロンコンピュヌタヌずしおのルヌタヌの意味はなくなりたす。

Optwareはか぀お無料のopenwrtファヌムりェアの開発の䞀郚でしたが、埌に独立したプロゞェクトに分割されたした。これは、Optwareが構築するパッケヌゞが完党に独立しおおり、自絊自足しおいるためです。 䜜業に必芁な暙準ラむブラリuclibcの圢匏のlibcもアセンブルされ、optwareに配眮されたす。 これにより、特定のデバむスのファヌムりェアの機胜をほずんど心配するこずなく、倚くのアプリケヌションを実行できたす。

このアプロヌチの欠点は、 すべおが機胜するずは限らないこずです。 たずえば、この方法でカヌネルモゞュヌルをビルドしお接続するこずはできたせん。 たた、独自の暙準ラむブラリにバむンドするこずは、既存の暙準ファヌムりェアラむブラリずずもにメモリにロヌドするこずを意味したす。これは、ルヌタヌのRAMの芁件が増えないこずを意味したす。 最埌に、特定の鉄に぀いおはシャヌプ化されおいないアセンブリを取埗したすが、「ナニバヌサルアベレヌゞルヌタヌ」のパッケヌゞはi386のプログラムのようなものですクヌルコアi7で同時に実行したす。特定のプロセッサ/プラットフォヌムの倚くの機胜は無芖され、レガシヌにロヌルバックされたす。 それでも、optwareは完党に機胜する゜リュヌションです。

Optwareは通垞、Linuxベヌスのホスト䞊のクロスコンパむラヌによっお構築されたすたずえば、ubuntu 12.04でコンパむルしたす。 プロゞェクトのsvnリポゞトリを確認するず、゜ヌスずREADMEファむルの䞡方をすぐに詳现な指瀺ずずもに受け取りたす興味のある人は誰でもどうぞ。



Openwrt


これは完党に独立したファヌムりェアであり、元の圚庫を完党に眮き換えたす。 ddwrt + optwareでは䞍十分であるこずが明らかになったずき、OpenWrtに連絡する必芁がありたした。 「スマヌトホヌム」に関するKhabrovの蚘事を読んで、さたざたなホヌム゚レクトリックを埐々に自動化するこずにしたした。 私はz-waveを遞び、「ホむッスル」を賌入し、z-wave.meクラりドに参加したした。 ただし、ホヌムオヌトメヌションをクラりドに接続するためにデスクトップをオンにしおおくのは無駄です。 さらに、私のルヌタヌには1぀ではなく、2぀のUSBポヌト党䜓がありたした。 しかし... ...は鳎りたせんでした。 必芁なカヌネルモゞュヌルcp21xxがファヌムりェアにありたせんでした。 この皮の゜フトりェアをオプトりェアで構築するこずはできたせんでした。 dd-wrtファヌムりェア党䜓を再構築するこずも完党に重芁なタスクですひどいシステムですツヌルチェヌンを蚭定し、すべおの䟝存関係を満たし、ビルドを成功させるのに私の忍耐は十分ではありたせんでした。 私のルヌタヌrt-n16のOpenwrtは最初はサポヌトされおいたせんでしたが、その時点で、動䜜するファヌムりェアを䜜成できるパッチが既にありたした。 だから私はdd-wrtに別れを告げ、「さらに無料の」ファヌムりェアを支持したした。

openwrtの良いずころは䜕ですか はい、 すべおが構成されおいるずいう事実によっお。 オプトりェアの䞍利な点を芋お、頭から远い出したす。 重耇するラむブラリはありたせん既存のファヌムりェアの゜フトりェアを盎接収集したす。 カヌネルモゞュヌルに問題はありたせん通垞の本栌的なlinux。゚キゟチックな「ホむッスル」が必芁ですか3Gモデムを取り付けおむンタヌネットを利甚したいですかそれは簡単です。 この゜フトりェアは、既存のプラットフォヌム向けに最適化できたすたた、コンパむラヌは、アセンブルするずきに、ルヌタヌのチップで特に䜿甚可胜な機胜を䜿甚し、レガシヌにロヌルバックしたせん。

最埌に、openwrtは実際にはオプトりェアず矛盟しないず蚀っおおく䟡倀がありたす。 より柔軟で快適です。 ただし、/ optパヌティションが以前のファヌムりェアから保存されおいる堎合、そこで䜿甚可胜な゜フトりェアは新しいopenwrtで正垞に起動する可胜性が高いでしょう。 䜕も組み立お盎したせん 確かに、分離オプトりェアのすべおの欠点は残りたす。



Embedded Sphinx-あなたはそれから䜕が必芁ですか



スフィンクスのスケヌラビリティは印象的です プロゞェクトの「powered by」ペヌゞで成果を怜蚎および評䟡するだけで十分です。 数十億のドキュメントのむンデックス。 1日に5億件のリク゚ストを凊理するこずは、かなり有効な数字です。 しかし、これはすべお、高速プロセッサず倧量のRAMを備えた深刻なマシンたたはクラスタヌでさえも高負荷です。 他の方向のスケヌラビリティに぀いおはどうですか メモリ䞍足、プロセッサずディスクがあいたいですか それはそれほど悪くないこずが刀明したした。 非x86ネむティブプラットフォヌムでは、sphinxはRaspberry Pi䞊で非垞に普通にビルドおよび内郚テストに合栌したす。 ただし、詳现を考慮するず、 他のアヌキテクチャに加えお、「Malinka」の他のすべおが非垞に優れおいたす。 最倧256-512MBのRAM そしお、スフィンクスにはこれが必芁です 実際、圌の「成功の秘 "」のほずんどは、利甚可胜な鉄の䜿甚を最倧限にするこずです。 圌は「640Kbですべおの人に十分」ずいう哲孊に向けられおいるわけではありたせんが、たったく逆です。 可胜な限り「ファッショナブルな」構成に埓っお、その機胜を最倧限に掻甚するよう努めおいたす。

メモリは安くなりたしたか むンデックス党䜓を拒吊しお抌し蟌みたす

印象的なアクセス時間を備えた新しい掟手なSSDは、本番環境でファッショナブルになりたしたか さお、プレむしおみお、おそらく内郚の戊略ずフォヌマットをもう䞀床シェむクしおください。

さらに、これは「新しい明るいパヌセントがあるため、これら3぀のギグラむンをBASICで蚘述されたスクリプトのバブルで゜ヌトする䜙裕がある」ずいうタむプの浪費ではありたせんが、たったく逆です。 経隓豊富なexgamedev開発者によっお実装され、ベンチマヌクによっお怜蚌された合理的な最適化。

そしお、あるケヌブルから別のケヌブルにバむトを転送する方法しかわからない、前代の「アンダヌコンピュヌタヌ」ず干枉する堎所はどこにあるのでしょうか たあ、実際には、なぜですか

もちろん、クロスコンパむルが暗瀺されおいたす䞀郚は、ネむティブツヌルチェヌンをルヌタヌ䞊で盎接ビルドしお実行できたす-しかし、私はこのアプロヌチの準備ができおいたせん。 クロスコンパむルはオヌトツヌルの倚くの内郚テストスフィンクスはそれらによっお構成されたすがサむドラむンに残るこずを意味するため、鉄片に搭茉されおいるものをツヌルチェヌンに䜕らかの圢で䌝える必芁がありたす。

そのため、スフィンクスを小さな鉄片で動かすには、たずタヌゲットプラットフォヌムの「ミニチュア」に関連するいく぀かのポむントを考慮する必芁がありたす。



メモリ芁件を最適化する


RAMに察するスフィンクスの速床たたは「スケヌル比」を満たす方法は ここではすべおが非垞に簡単です。 Sphinxは「そのような」リ゜ヌスを消費したせん。 圌の「倧食い」は、むンデックスのタスクずボリュヌムに盎接䟝存したす。 ほずんどの堎合、蚘憶の䞭の堎所を占めるのは圌です。 したがっお、むンデックスが小さいほど、必芁なメモリが少なくなりたす。

蟞曞.spiファむルおよび属性blob.spa、.sps、.spmファむルがRAMにロヌドされたす。 これらのファむルのサむズを芋積もるず、将来の「倧食い」のかなり正確な予枬を行うこずができたす。

完党にタむトな堎合は、属性を削陀しお、ディスク䞊の蟞曞オプションを有効にするこずができたす。 そうするず、すべおが遅くお悲しくなりたすが、完党にディスク䞊にありたす。 ただし、䜕も無効にするこずはできず、スワップパヌティションを接続するだけです。 それはメモリに収たりたす-「飛びたす」。 収たらない堎合は、自動的にスワップに入り、「ゆっくりず悲しいこずに動䜜したす」ずいうオプションが衚瀺されたす。



むンデックスタむプ


私はい぀ものものを取りたした。 キヌワヌドディクショナリを䜿甚したすcrcのみが既に叀くなっおいたす。 デヌタ自䜓をリアルタむムで倉曎する必芁がないずいう理由だけで、RTは必芁ありたせん。 定期的にむンデックスを再䜜成するだけで十分ですはい、必芁に応じおrtが急䞊昇したす。 これは、searchdデヌモンだけでは䞍十分であり、むンデクサヌも必芁であるこずを意味したす。



デヌタ゜ヌスぞのリンク


他に䜕 適切なデヌタ゜ヌスこの堎合はmysqlのサポヌトが必芁です。 最近たで、このサポヌトでは、スフィンクス自䜓のアヌキテクチャに関連する特定の「レヌキ」がありたした。぀たり、「メガバむト」のlibsphinxず、ダむレクトむンデクサヌ、searchdなどのツヌルを実装する小さな゜ヌスで構成されおいたす。 同時に、むンデックスを操䜜するためのほずんどすべおの機胜デヌタ゜ヌスからの䜜成を含むはlibsphinxにありたす。 ゜ヌスサポヌトの「レヌキ」は、mysqlサポヌトでスフィンクスを収集した埌、共通のメガリバを介したすべおのスフィンクスバむナリがlibmysqlclientに䟝存するこずです。 深刻なマシンではこれは問題ではありたせんが、ルヌタヌでは「そのように」リンクされおいるラむブラリに䟝存しおいたすが、䜜業には絶察に必芁ありたせん。無駄です。 2぀のオプションがありたす。2぀のアセンブリを䜜成したす。 1぀はmysqlをサポヌトし、2぀目はたったくむンデックスを䜜成したせん。 最初からむンデクサヌ、2番目から-その他すべお。 2番目のオプションは最近登堎したした-必芁なすべおの倖郚ラむブラリを明瀺的にdlopen経由でロヌドするだけです。 この堎合、䞍芁な䟝存関係を忘れるこずができたす。むンデクサヌは必芁なずきにラむブラリをロヌドしたす。 searchdは圌女にたったく觊れたせん。



悪魔を始めるには


叀兞的な方法は、スフィンクス自䜓に実装されおいたす。 これはダブルフォヌクです-最初にアクティブタヌミナルからフックを解陀し、次に新しい䜜業セッションを䜜成したす-そしお今はバックグラりンドで動䜜し、コン゜ヌルはなく、タヌミナルでCtrl + Cを抌しおも応答したせん。 pidファむルにpidを曞き蟌みたす-これで、本栌的な悪魔になりたした。 すべおは倧䞈倫のようですが、すべおの悪魔はこれをシステムに実装する必芁がありたす。 オヌプン゜ヌスシステムでコヌドを耇補する理由 賢い人は考えお、考えお、やっお来たした-デヌモンになるために「実隓」プロセスを必芁ずせず、単にバックグラりンドでそれを維持し、pidファむルを共通の堎所に栌玍し、同時にデヌモンを再起動する「番犬」を実装したす突然の萜䞋の結果。 ちなみに、このために䞀時的には、スタヌトアップを通じおスフィンクスを起動する際に問題が発生したした-2぀のあたりにもスマヌトなプログラムはただ同意できたせんでした。 その結果、upstartの䞋からの正しいオプションは、オプション '--nodetach'で実行し、実行䞭のプロセスおよびそのフォヌクではないを監芖するこずです。 同時に、スフィンクスは自分自身を悪魔ずは芋なさず、すべおのバックグラりンド管理は新興䌁業に委ねられたす。

ただし、組み蟌みの堎合、optware、openwrtが埓来のrc.dスクリプトを䜿甚する限り、upstartに問題はありたせん。 ぀たり、特別なフラグは必芁ありたせん。 スフィンクスは圌自身の人生を支配したす。



ログを保存する堎所は


最初に、スフィンクスは、すべおのリク゚ストの個別のログず同様に、悪魔の共通のログfell-got-rotatedを保持したす。 ルヌタヌのフラッシュメモリに䜕かを曞き蟌むこずは、サむズを制埡しなくおも自殺のようになるこずは明らかです。 したがっお、構成ファむルで「syslog」をログずしお指定し、アセンブリの構成時に--with-syslogを远加するこずも忘れないでくださいただし、既定で既に有効になっおいたす。 その結果、すべおの出力がシステムログに曞き蟌たれたす。これにより、ルヌタヌ自䜓のシステムレベルで既に操䜜が行われたす。 そしお、ファヌムりェアの機胜に応じお、いく぀かのオプションがありたす。 䞀郚の非垞に小さなフラッシュを備えた叀いDIR-300などでは、ログをたったく保持しない方が簡単です。 その他の堎合、ピヌスはメモリ内のリングバッファに盎接栌玍され、logreadコマンドを䜿甚しおコン゜ヌルから読み取るこずができたす。 3぀目は、udpを介しおLAN内のサヌバヌにリダむレクトされたす。 しかし、いずれにせよ-これはもはやスフィンクスの問題ではありたせん



構成可胜および収集



ルヌタヌ䞊のデヌモンの動䜜に関するすべおの質問は解決されたようです。 今が構築の時です



チヌトオヌトツヌル


Sphinxはautotoolsを䜿甚しお構成されたす。 ./configure-アセンブリの前に実行されるスクリプトは、アセンブリシステムを正盎にアむロン掛けし、䜿甚しおいるコンパむラ、サポヌトされおいる機胜、アヌキテクチャ、バむトオヌダヌLSBたたはMSBを芋぀けたす。 問題は、これらのテストのほずんどすべおがタヌゲットルヌタヌではなく、ツヌルチェヌンを実行するシステムに圱響するこずです。 したがっお、1぀の方法しかありたせん。構成の「正解」を促す方法です。 これは環境倉数を䜿甚しお行われたす。 たずえば、。/ configureがqsort関数の可甚性をチェックする堎合、。/ configureを実行する前にac_cv_func_qsort倉数を定矩するこずにより、必芁な「ヒント」を䞎えるこずができたす。 たずえば、アセンブルする前にexport ac_cv_func_qsort=no



実行するず、qsort関数がないず想定されたす。 したがっお、この方法で構成されたパッケヌゞは、独自の実装を䜿甚するか、アセンブリ䞭に砎損するこずさえありたすハハ。

埋め蟌みスフィンクスの「明瀺的なヒント」を䜜成するために必芁なものはほずんどありたせん。 ここにありたす...



はい、ずころで-前述の倉数呜名スタむル、「正しい答え」を促す方法は、ご存じのずおり、スフィンクスの玔粋な機胜ではなく、オヌトツヌルのプロパティです。 autotoolsを䜿甚しお蚘述された他の゜フトりェアを蚭定するずきに、答えを「プロンプト」するこずができるのずたったく同じ方法です。



オプトりェアのスフィンクス


タヌゲットプラットフォヌム私はddwrt甚にビルドしたのフォルダヌで、makeフォルダヌに移動し、template.mkをsphinxsearch.mkにコピヌしたす。 次に、ファむル自䜓の指瀺に埓っお、結果のコピヌを線集したす。 実際、これは、゜フトりェアをオプトりェアに远加するために必芁なそしおしばしば十分な唯䞀のスクリプトです。 メむンアセンブリを構成するこのスクリプトの重芁な郚分を次に瀺したす。



 (SPHINXSEARCH_BUILD_DIR)/.configured: sphinxsearch-source make/sphinxsearch.mk $(MAKE) libstdc++-stage $(MAKE) expat-stage $(MAKE) mysql5-stage rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) $(SPHINXSEARCH_UNZIP) $(DL_DIR)/$(SPHINXSEARCH_SOURCE) | tar -C $(BUILD_DIR) -xvf - $(LIBSTEMMER_UNZIP) $(DL_DIR)/$(LIBSTEMMER_SOURCE) | tar -C $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -xvf - if test -n "$(SPHINXSEARCH_PATCHES)" ; \ then cat $(SPHINXSEARCH_PATCHES) | \ patch -d $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -p0 ; \ fi if test "$(BUILD_DIR)/$(SPHINXSEARCH_DIR)" != "$(@D)" ; \ then mv $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) ; \ fi (cd $(@D); \ export ac_cv_func_realloc_0_nonnull=yes; \ export ac_cv_func_malloc_0_nonnull=yes; \ export sphinx_cv_unaligned_ram_access=yes; \ export ac_cv_c_bigendian=no; \ export sphinx_cv_interlocked=no; \ $(TARGET_CONFIGURE_OPTS) \ CPPFLAGS="$(STAGING_CPPFLAGS) $(SPHINXSEARCH_CPPFLAGS)" \ LDFLAGS="$(STAGING_LDFLAGS) $(SPHINXSEARCH_LDFLAGS)" \ ./configure \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_TARGET_NAME) \ --target=$(GNU_TARGET_NAME) \ --prefix=/opt \ --sysconfdir=/opt/etc/sphinxsearch \ --with-libstemmer \ --with-mysql=$(STAGING_PREFIX) \ --without-unixodbc \ --with-syslog \ --enable-dl \ ) touch $@
      
      







アセンブリの残りの郚分は簡単ですメむク、ストリップ、パッケヌゞング。 スフィンクスの゜ヌスに加えお、libstemmerの゜ヌスも必芁ですアセンブリ䞭にサむトから盎接プルされたす。 たた、コンパむルされたexpatずmysqlが必芁です䟝存しおいる限り、これらは䟝存関係ずしおビルドされたす。 メむンのメむクファむル./makeにありたすに加えお、フォルダヌ./sources/sphinxsearchもoptware゜ヌスのフォルダヌ構造で䜿甚されたす。 これには、デヌモン甚のinitスクリプトが含たれおいたす。これはパッケヌゞにパッケヌゞ化され、むンストヌル䞭は/opt/etc/init.dに栌玍されたす。 アセンブリはルヌトフォルダヌから実行され、特定のサフィックスがパッケヌゞ名に远加されたす。



接尟蟞-ipkを䜿甚したアセンブリの結果、「すぐに䜿甚できる」パッケヌゞsphinxsearch.ipkが取埗されたす。これは、ipkgを䜿甚しおoptwareにむンストヌルしたす。 その埌、すべおが通垞通りです-蚭定を䜜成し、むンデックスを䜜成したすdd-wrtがデフォルトのLSBである限り、デスクトップでむンデックスを䜜成できたす-そしお離陞したす。 出来䞊がり 必芁に応じお、mysqlぞの䟝存関係を削陀できたす完党な構成のSPHINXSEARCH_DEPENDSディレクティブを参照-デヌモン自䜓を起動するためにこのラむブラリが必芁でない限りそしお、偎でむンデックスを䜜成する堎合、ルヌタヌではたったく必芁ありたせん。 䞊蚘のスクリプトのac_cv_ ...およびsphinx_cv_ ...倉数をわずかに修正する必芁がある堎合がありたす。これらはdd-wrtのオプトりェアビルドに基づいおいたすこれはミプセルアヌキテクチャ、぀たりリトル゚ンディアンであり、同時にチップ機胜のセットはレガシヌに瞮小されたす



Openwrtのスフィンクス


タヌゲットopenwrtがmips䞊にある堎合、optwrwareはddwrtから起動できたせんmipselがありたす。 mipselでもある堎合は、optwareからsphinxを実行できたすが、この堎合、openwrtの完党なオヌプン性を䜿甚しお、タヌゲットシステム専甚のアセンブリを䜜成する方がはるかに正圓化されたす。これにより、埓来の制限がなくなり、より最適なコヌドが取埗されたす。暙準ラむブラリの別の「わずかに異なる」むンスタンスをメモリにロヌドしたせん。

Openwrtは、ビルドにmakeスクリプトも䜿甚したす。圢匏ず堎所のみが異なりたす。 必芁なファむルは、アセンブリ環境のルヌトからパッケヌゞツリヌのどこかに䜜成された別のフォルダヌに配眮されたす。 たずえば、パッケヌゞ/ネットワヌク/サヌビス/スフィンクスを遞択したした。 Makefileは、指定されたフォルダヌに最䜎限必芁です。たた、定矩枈みの名前を持぀他のファむルおよびフォルダヌが存圚する堎合がありたす。 Makefileに加えお、Config.inメむンmenuconfigでサブメニュヌを䜜成したす、およびサンプルのconfigおよびinitスクリプトが眮かれおいるファむル/フォルダヌも䜿甚したすずころで、optwareよりもはるかに短い。 openwrtの構成の重芁な郚分は次のようになりたす。

 CONFIGURE_VARS += \ ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nunnul=yes \ ac_cv_c_bigendian=yes \ sphinx_cv_unaligned_ram_access=yes CONFIGURE_ARGS += \ --prefix=/ \ --sysconfdir=/etc/sphinx \ $(if $(CONFIG_SPHINX_MYSQL_SUPPORT),--with-mysql,--without-mysql) \ $(if $(CONFIG_SPHINX_PGSQL_SUPPORT),--with-pgsql,--without-pgsql) \ $(if $(CONFIG_SPHINX_UNIXODBC_SUPPORT),--with-unixodbc,--without-unixodbc) \ $(if $(CONFIG_SPHINX_EXPAT_SUPPORT),--with-libexpat,--without-libexpat) \ $(if $(CONFIG_SPHINX_DYNAMIC_LOAD),--enable-dl,,) \ --with-syslog \ --with-libstemmer
      
      







芖芚的にもオプトりェアよりも短くなっおいたすスクリプト党䜓も倧幅に短くなっおいたす-84行のみで、そのほずんどがテンプレヌトです。 これには、メニュヌから蚭定される倉数が含たれたす。 このバヌゞョンでは、必芁に応じおac_cv_c_bigendianを修正する必芁がある堎合がありたすMIPS、぀たりビッグ゚ンディアンであるNetGear WNDR4300ルヌタヌを構築したした。 このバヌゞョンでも、アセンブリ䞭にlibstemmerを個別にロヌドしたせんでした。 代わりに、事前に自分でダりンロヌドしお、゜ヌスずずもにtarballにパックする必芁がありたすそしお、PKG_MD5SUMを受け取ったtarballが持぀ものに修正したす。

openwrtでのパッケヌゞのビルドは2段階のプロセスです。 たず、ルヌトフォルダヌでmenuconfigを実行し、ファヌムりェア党䜓を構成したす。 そこで、ネットワヌク/ Webサヌバヌ/プロキシセクションに移動する必芁がありたす-すでにそこにモゞュヌルMずしおsphinxを遞択しおください。 ここで、構成サブメニュヌに移動し、必芁なデヌタ゜ヌスをサポヌトするアセンブリを配眮できたす。 次に、menuconfigを終了し、倉曎を保存したす。最埌に、ファヌムりェア党䜓のアセンブリを開始したす。

䜜る

たたは1぀だけのスフィンクス圓然、必芁に応じお䟝存関係あり

パッケヌゞ化/ネットワヌク/サヌビス/ sphinx /コンパむル

受信したパッケヌゞは、フォルダヌ./bin/ARCH/packages私の堎合は./bin/ar71xx/packagesに远加されたす。 パッケヌゞを怜玢しおルヌタヌにコピヌするそしおopkgを蚭定するか、ロヌカルWebサヌバヌでアセンブリフォルダヌを公開し、ルヌタヌの/etc/opkg.confにパスを曞き蟌んでからopkg updateするこずで、パッケヌゞを盎接むンストヌルできたす。 opkg install sphinx。

ルヌタヌでむンデックスを䜜成するために、mysqlクラむアントラむブラリを個別にむンストヌルする必芁がある堎合がありたす必芁なラむブラリの動的ロヌドを䜿甚する構成の堎合、むンストヌルによっおは芏定したせんでした。 それでも-手動でシンボリックリンクを䜜成したすlibがあるフォルダヌでln -s libmysqlclient.so.16.0.0 libmysqlclient.soコマンドを䜿甚。 それ以倖の堎合は、すべおがそのたた䜿甚できたす。 私のアプリケヌションはsphinxqlプロトコルに埓っおスフィンクスを䜿甚したす぀たり、同じlibmysqlclientはsphinxがmysqlのむンデックスを䜜成するためだけでなく、クラむアントもスフィンクス自䜓ず連携するために䜿甚されたすクラむアントアプリケヌションも非垞に機胜的です。



最埌に-構成ずスクリプト。



オプトりェアの堎合

アセンブリスクリプト
sphinxsearch.mkファむルに配眮され、optwareプラットフォヌムのmakeフォルダヌに配眮されたす

 ########################################################### # # sphinxsearch # ########################################################### # You must replace "sphinxsearch" and "SPHINXSEARCH" with the lower case name and # upper case name of your new package. Some places below will say # "Do not change this" - that does not include this global change, # which must always be done to ensure we have unique names. # # SPHINXSEARCH_VERSION, SPHINXSEARCH_SITE and SPHINXSEARCH_SOURCE define # the upstream location of the source code for the package. # SPHINXSEARCH_DIR is the directory which is created when the source # archive is unpacked. # SPHINXSEARCH_UNZIP is the command used to unzip the source. # It is usually "zcat" (for .gz) or "bzcat" (for .bz2) # # You should change all these variables to suit your package. # Please make sure that you add a description, and that you # list all your packages' dependencies, seperated by commas. # # If you list yourself as MAINTAINER, please give a valid email # address, and indicate your irc nick if it cannot be easily deduced # from your name or email address. If you leave MAINTAINER set to # "NSLU2 Linux" other developers will feel free to edit. # http://sphinxsearch.com/files/sphinx-2.0.5-release.tar.gz #SPHINXSEARCH_SITE=http://sphinxsearch.com/files SPHINXSEARCH_SITE=http://192.168.1.5:65080/r/sphinxsearch SPHINXSEARCH_VERSION=2.2.2-4470 SPHINXSEARCH_SOURCE=sphinx-$(SPHINXSEARCH_VERSION).tar.gz SPHINXSEARCH_DIR=sphinx-$(SPHINXSEARCH_VERSION) SPHINXSEARCH_UNZIP=zcat SPHINXSEARCH_MAINTAINER=NSLU2 Linux <nslu2-linux@yahoogroups.com> SPHINXSEARCH_DESCRIPTION=Sphinx is free open-source SQL full-text search engine. SPHINXSEARCH_SECTION=misc SPHINXSEARCH_PRIORITY=optional SPHINXSEARCH_DEPENDS=libstdc++, expat, mysql5 SPHINXSEARCH_SUGGESTS= SPHINXSEARCH_CONFLICTS= LIBSTEMMER_SITE=http://snowball.tartarus.org/dist LIBSTEMMER_SOURCE=libstemmer_c.tgz LIBSTEMMER_UNZIP=zcat # # SPHINXSEARCH_IPK_VERSION should be incremented when the ipk changes. # SPHINXSEARCH_IPK_VERSION=2 # # SPHINXSEARCH_CONFFILES should be a list of user-editable files SPHINXSEARCH_CONFFILES=/opt/etc/sphinxsearch/sphinx.conf # # SPHINXSEARCH_PATCHES should list any patches, in the the order in # which they should be applied to the source code. # #SPHINXSEARCH_PATCHES=$(SPHINXSEARCH_SOURCE_DIR)/configure.patch SPHINXSEARCH_PATCHES= # # If the compilation of the package requires additional # compilation or linking flags, then list them here. # SPHINXSEARCH_CPPFLAGS= SPHINXSEARCH_LDFLAGS= # # SPHINXSEARCH_BUILD_DIR is the directory in which the build is done. # SPHINXSEARCH_SOURCE_DIR is the directory which holds all the # patches and ipkg control files. # SPHINXSEARCH_IPK_DIR is the directory in which the ipk is built. # SPHINXSEARCH_IPK is the name of the resulting ipk files. # # You should not change any of these variables. # SPHINXSEARCH_BUILD_DIR=$(BUILD_DIR)/sphinxsearch SPHINXSEARCH_SOURCE_DIR=$(SOURCE_DIR)/sphinxsearch SPHINXSEARCH_IPK_DIR=$(BUILD_DIR)/sphinxsearch-$(SPHINXSEARCH_VERSION)-ipk SPHINXSEARCH_IPK=$(BUILD_DIR)/sphinxsearch_$(SPHINXSEARCH_VERSION)-$(SPHINXSEARCH_IPK_VERSION)_$(TARGET_ARCH).ipk .PHONY: sphinxsearch-source sphinxsearch-unpack sphinxsearch sphinxsearch-stage sphinxsearch-ipk sphinxsearch-clean sphinxsearch-dirclean sphinxsearch-check # # This is the dependency on the source code. If the source is missing, # then it will be fetched from the site using wget. # $(DL_DIR)/$(SPHINXSEARCH_SOURCE): $(WGET) -P $(@D) $(SPHINXSEARCH_SITE)/$(@F) || \ $(WGET) -P $(@D) $(SOURCES_NLO_SITE)/$(@F) $(DL_DIR)/$(LIBSTEMMER_SOURCE): $(WGET) -P $(@D) $(LIBSTEMMER_SITE)/$(@F) || \ $(WGET) -P $(@D) $(SOURCES_NLO_SITE)/$(@F) # # The source code depends on it existing within the download directory. # This target will be called by the top level Makefile to download the # source code's archive (.tar.gz, .bz2, etc.) # sphinxsearch-source: $(DL_DIR)/$(SPHINXSEARCH_SOURCE) $(DL_DIR)/$(LIBSTEMMER_SOURCE) $(SPHINXSEARCH_PATCHES) # # This target unpacks the source code in the build directory. # If the source archive is not .tar.gz or .tar.bz2, then you will need # to change the commands here. Patches to the source code are also # applied in this target as required. # # This target also configures the build within the build directory. # Flags such as LDFLAGS and CPPFLAGS should be passed into configure # and NOT $(MAKE) below. Passing it to configure causes configure to # correctly BUILD the Makefile with the right paths, where passing it # to Make causes it to override the default search paths of the compiler. # # If the compilation of the package requires other packages to be staged # first, then do that first (eg "$(MAKE) <bar>-stage <baz>-stage"). # # If the package uses GNU libtool, you should invoke $(PATCH_LIBTOOL) as # shown below to make various patches to it. # $(SPHINXSEARCH_BUILD_DIR)/.configured: sphinxsearch-source make/sphinxsearch.mk $(MAKE) libstdc++-stage $(MAKE) expat-stage $(MAKE) mysql5-stage rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) $(SPHINXSEARCH_UNZIP) $(DL_DIR)/$(SPHINXSEARCH_SOURCE) | tar -C $(BUILD_DIR) -xvf - $(LIBSTEMMER_UNZIP) $(DL_DIR)/$(LIBSTEMMER_SOURCE) | tar -C $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -xvf - if test -n "$(SPHINXSEARCH_PATCHES)" ; \ then cat $(SPHINXSEARCH_PATCHES) | \ patch -d $(BUILD_DIR)/$(SPHINXSEARCH_DIR) -p0 ; \ fi if test "$(BUILD_DIR)/$(SPHINXSEARCH_DIR)" != "$(@D)" ; \ then mv $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(@D) ; \ fi (cd $(@D); \ export ac_cv_func_realloc_0_nonnull=yes; \ export ac_cv_func_malloc_0_nonnull=yes; \ export sphinx_cv_unaligned_ram_access=yes; \ export sphinx_cv_interlocked=no; \ $(TARGET_CONFIGURE_OPTS) \ CPPFLAGS="$(STAGING_CPPFLAGS) $(SPHINXSEARCH_CPPFLAGS)" \ LDFLAGS="$(STAGING_LDFLAGS) $(SPHINXSEARCH_LDFLAGS)" \ ./configure \ --build=$(GNU_HOST_NAME) \ --host=$(GNU_TARGET_NAME) \ --target=$(GNU_TARGET_NAME) \ --prefix=/opt \ --sysconfdir=/opt/etc/sphinxsearch \ --with-libstemmer \ --with-mysql=$(STAGING_PREFIX) \ --without-unixodbc \ --with-syslog \ --enable-dl \ ) # $(PATCH_LIBTOOL) $(@D)/libtool touch $@ sphinxsearch-unpack: $(SPHINXSEARCH_BUILD_DIR)/.configured # # This builds the actual binary. # $(SPHINXSEARCH_BUILD_DIR)/.built: $(SPHINXSEARCH_BUILD_DIR)/.configured rm -f $@ $(MAKE) -C $(@D) touch $@ # # This is the build convenience target. # sphinxsearch: $(SPHINXSEARCH_BUILD_DIR)/.built # # If you are building a library, then you need to stage it too. # $(SPHINXSEARCH_BUILD_DIR)/.staged: $(SPHINXSEARCH_BUILD_DIR)/.built rm -f $@ $(MAKE) -C $(@D) DESTDIR=$(STAGING_DIR) install touch $@ sphinxsearch-stage: $(SPHINXSEARCH_BUILD_DIR)/.staged # # This rule creates a control file for ipkg. It is no longer # necessary to create a seperate control file under sources/sphinxsearch # $(SPHINXSEARCH_IPK_DIR)/CONTROL/control: @install -d $(@D) @rm -f $@ @echo "Package: sphinxsearch" >>$@ @echo "Architecture: $(TARGET_ARCH)" >>$@ @echo "Priority: $(SPHINXSEARCH_PRIORITY)" >>$@ @echo "Section: $(SPHINXSEARCH_SECTION)" >>$@ @echo "Version: $(SPHINXSEARCH_VERSION)-$(SPHINXSEARCH_IPK_VERSION)" >>$@ @echo "Maintainer: $(SPHINXSEARCH_MAINTAINER)" >>$@ @echo "Source: $(SPHINXSEARCH_SITE)/$(SPHINXSEARCH_SOURCE)" >>$@ @echo "Description: $(SPHINXSEARCH_DESCRIPTION)" >>$@ @echo "Depends: $(SPHINXSEARCH_DEPENDS)" >>$@ @echo "Suggests: $(SPHINXSEARCH_SUGGESTS)" >>$@ @echo "Conflicts: $(SPHINXSEARCH_CONFLICTS)" >>$@ # # This builds the IPK file. # # Binaries should be installed into $(SPHINXSEARCH_IPK_DIR)/opt/sbin or $(SPHINXSEARCH_IPK_DIR)/opt/bin # (use the location in a well-known Linux distro as a guide for choosing sbin or bin). # Libraries and include files should be installed into $(SPHINXSEARCH_IPK_DIR)/opt/{lib,include} # Configuration files should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/... # Documentation files should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch/... # Daemon startup scripts should be installed in $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/S??sphinxsearch # # You may need to patch your application to make it use these locations. # $(SPHINXSEARCH_IPK): $(SPHINXSEARCH_BUILD_DIR)/.built rm -rf $(SPHINXSEARCH_IPK_DIR) $(BUILD_DIR)/sphinxsearch_*_$(TARGET_ARCH).ipk $(MAKE) -C $(SPHINXSEARCH_BUILD_DIR) DESTDIR=$(SPHINXSEARCH_IPK_DIR) install-strip install -d $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch install -m 644 $(SPHINXSEARCH_BUILD_DIR)/sphinx-min.conf.dist $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx.conf install -d $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch install -m 644 $(SPHINXSEARCH_BUILD_DIR)/doc/sphinx.txt $(SPHINXSEARCH_IPK_DIR)/opt/doc/sphinxsearch/sphinx.txt rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx.conf.dist rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/example.sql rm $(SPHINXSEARCH_IPK_DIR)/opt/etc/sphinxsearch/sphinx-min.conf.dist install -d $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/rc.sphinxsearch $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/S90sphinxsearch ln -s S90sphinxsearch $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/K70sphinxsearch # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/opt/etc/init.d/SXXsphinxsearch $(MAKE) $(SPHINXSEARCH_IPK_DIR)/CONTROL/control # install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/postinst $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst # install -m 755 $(SPHINXSEARCH_SOURCE_DIR)/prerm $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm # sed -i -e '/^#!/aOPTWARE_TARGET=${OPTWARE_TARGET}' $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm # if test -n "$(UPD-ALT_PREFIX)"; then \ sed -i -e '/^[ ]*update-alternatives /s|update-alternatives|$(UPD-ALT_PREFIX)/bin/&|' \ $(SPHINXSEARCH_IPK_DIR)/CONTROL/postinst $(SPHINXSEARCH_IPK_DIR)/CONTROL/prerm; \ fi echo $(SPHINXSEARCH_CONFFILES) | sed -e 's/ /\n/g' > $(SPHINXSEARCH_IPK_DIR)/CONTROL/conffiles cd $(BUILD_DIR); $(IPKG_BUILD) $(SPHINXSEARCH_IPK_DIR) $(WHAT_TO_DO_WITH_IPK_DIR) $(SPHINXSEARCH_IPK_DIR) # # This is called from the top level makefile to create the IPK file. # sphinxsearch-ipk: $(SPHINXSEARCH_IPK) # # This is called from the top level makefile to clean all of the built files. # sphinxsearch-clean: rm -f $(SPHINXSEARCH_BUILD_DIR)/.built -$(MAKE) -C $(SPHINXSEARCH_BUILD_DIR) clean # # This is called from the top level makefile to clean all dynamically created # directories. # sphinxsearch-dirclean: rm -rf $(BUILD_DIR)/$(SPHINXSEARCH_DIR) $(SPHINXSEARCH_BUILD_DIR) $(SPHINXSEARCH_IPK_DIR) $(SPHINXSEARCH_IPK) # # # Some sanity check for the package. # sphinxsearch-check: $(SPHINXSEARCH_IPK) perl scripts/optware-check-package.pl --target=$(OPTWARE_TARGET) $^
      
      







初期化スクリプト
rc.sphinxsearchファむルに配眮され、optwareプラットフォヌムのsources / sphinxsearchフォルダヌに配眮されたす最初にフォルダヌを䜜成する必芁がありたす。 アセンブリ時に、パッケヌゞにコピヌされたす。

 #!/bin/sh NAME=sphinxsearch DAEMON=searchd # only used for virgin run DATA_PART=/mnt [ -d /mnt/C ] && DATA_PART=/mnt/C prefix="/opt" export PATH=${prefix}/bin:${prefix}/sbin:/bin:/usr/bin:/sbin:/usr/sbin:${PATH} DAEMON=${prefix}/bin/${DAEMON} SCRIPT="`basename $0`" test -x $DAEMON || exit 0 if [ -z "$1" ] ; then case `echo "$0" | sed 's:^.*/\(.*\):\1:g'` in S??*) rc="start" ;; K??*) rc="stop" ;; *) rc="usage" ;; esac else rc="$1" fi case "$rc" in start) if [ -n "`pidof $DAEMON`" ]; then echo "$NAME is already running" else echo "Starting SphinxSearch daemon: $NAME" export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH pth=`pwd` $DAEMON cd "$pth" export LD_LIBRARY_PATH=$OLD_LIBRARY_PATH fi ;; stop) if [ -n "`pidof $DAEMON`" ]; then echo "Stopping SphinxSearch daemon: $NAME" pth=`pwd` n=1 while true; do $DAEMON --stop sleep 1 [ ! -n "`pidof $DAEMON`" ] && break sleep 5 [ $n -gt 3 ] && break let n+=1 done n=1 while true; do killall -9 $NAME 2>/dev/null sleep 1 [ ! -n "`pidof $DAEMON`" ] && break sleep 2 [ $n -gt 10 ] && break let n+=1 done if [ -n "`pidof $DAEMON`" ]; then echo "Termination of $NAME was not successful, it keeps running" sleep 1 fi cd "$pth" else echo "$NAME already stopped" fi ;; status) if [ -n "`pidof $DAEMON`" ]; then echo "$NAME is running" else echo "$NAME is not running" fi ;; restart) "$0" stop "$0" start ;; *) echo "Usage: $0 (start|stop|restart|usage)" ;; esac exit 0
      
      









openwrtの堎合

アセンブリスクリプト
Makefile package/network/services/sphinx ( ).

 include $(TOPDIR)/rules.mk PKG_NAME:=sphinx PKG_VERSION:=2.2.2 PKG_REVISION:=4470 PKG_SUFFIX:=stemmer PKG_RELEASE:=2 #PKG_MD5SUM:=3119bbeafc9e32637339c6e95a3317ef PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REVISION)-$(PKG_SUFFIX).tar.gz PKG_MAINTAINER:=Aleksey Vinogradov <klirichek@sphinxsearch.com> PKG_SOURCE_URL:=http://192.168.1.5:65080/r/sphinxsearch PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REVISION)-$(PKG_SUFFIX) PKG_BUILD_PARALLEL:=1 PKG_DPNDS:= +SPHINX_MYSQL_SUPPORT:libmysqlclient +SPHINX_PGSQL_SUPPORT:libpq +SPHINX_UNIXODBC_SUPPORT:unixodbc +SPHINX_EXPAT_SUPPORT:libexpat ifeq ($(CONFIG_SPHINX_DYNAMIC_LOAD),y) PKG_BUILD_DEPENDS:= $(PKG_DEPENDS) endif include $(INCLUDE_DIR)/package.mk define Package/sphinx SECTION:=net CATEGORY:=Network SUBMENU:=Web Servers/Proxies TITLE:=sphinxsearch - fast FT search engine server DEPENDS:=+libstdcpp +librt +libpthread +zlib ifneq ($(CONFIG_SPHINX_DYNAMIC_LOAD),y) DEPENDS+= $(PKG_DPNDS) endif MENU:=1 endef define Package/sphinx/config source "$(SOURCE)/Config.in" endef define Package/sphinx/conffiles /etc/sphinx/sphinx.conf endef #    :) define Package/sphinx/description This is placeholder for sphinxsearch description endef CONFIGURE_VARS += \ ac_cv_func_realloc_0_nonnull=yes \ ac_cv_func_malloc_0_nunnul=yes \ ac_cv_c_bigendian=yes \ sphinx_cv_unaligned_ram_access=yes CONFIGURE_ARGS += \ --prefix=/ \ --sysconfdir=/etc/sphinx \ $(if $(CONFIG_SPHINX_MYSQL_SUPPORT),--with-mysql,--without-mysql) \ $(if $(CONFIG_SPHINX_PGSQL_SUPPORT),--with-pgsql,--without-pgsql) \ $(if $(CONFIG_SPHINX_UNIXODBC_SUPPORT),--with-unixodbc,--without-unixodbc) \ $(if $(CONFIG_SPHINX_EXPAT_SUPPORT),--with-libexpat,--without-libexpat) \ $(if $(CONFIG_SPHINX_DYNAMIC_LOAD),--enable-dl,,) \ --with-syslog \ --with-libstemmer define Package/sphinx/install $(INSTALL_DIR) $(1)/etc/sphinx $(INSTALL_DATA) ./files/sphinx.conf $(1)/etc/sphinx/sphinx.conf $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/sphinx.init $(1)/etc/init.d/sphinx $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/searchd $(1)/usr/sbin/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/indexer $(1)/usr/sbin/ #     -   . # $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/indextool $(1)/usr/sbin/ # $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/spelldump $(1)/usr/sbin/ endef $(eval $(call BuildPackage,sphinx))
      
      





メニュヌ構成
Config.in Makefile package/network/services/sphinx

 # sphinx config menu "Configuration" depends on PACKAGE_sphinx config SPHINX_DYNAMIC_LOAD bool "Load all client libs for accessing sources dynamically" default y help This will force the sphinx to load necessary db libs only when actually using db sources (otherwize they will be linked statically and will be dependencies for the sphinx package) config SPHINX_MYSQL_SUPPORT bool "Enable indexing of mysql databases" select PACKAGE_libmysqlclient default n help This will build the sphinx with supporting of mysql db indexing. It will allow to use source type=mysql, and also need libmysqlclient library in order to work. config SPHINX_PGSQL_SUPPORT bool "Enable indexing of posgresql databases" select PACKAGE_libpq default n help This will build the sphinx with supporting of posgresql db indexing. It will allow to use source type=pgsql, and also need libpq library in order to work. config SPHINX_UNIXODBC_SUPPORT bool "Enable indexing of odbc sources" select PACKAGE_unixodbc default n help This will build the sphinx with supporting of indexing odbc sources. It will allow to use source type=odbc, and also need unixodbc library in order to work. config SPHINX_EXPAT_SUPPORT bool "Enable indexing of xmlpipe sources" select PACKAGE_libexpat default n help This will build the sphinx with supporting of indexing xmlpipes. It will allow to use source type=xmlpipe2, and also need libexpat library in order to work. endmenu
      
      





初期化スクリプト
sphinx.init package/network/services/sphinx/files ( )

 #!/bin/sh /etc/rc.common # Copyright (C) 2010-2011 OpenWrt.org START=95 STOP=10 SERVICE_STOP_TIME=9 #PREFIX=/opt PREFIX="" error() { echo "${initscript}:" "$@" 1>&2 } start() { $PREFIX/usr/sbin/searchd } stop() { $PREFIX/usr/sbin/searchd --stop }
      
      





構成䟋
sphinx.conf sphinx.init package/network/services/sphinx/files

; .

 # # Sphinx index for library (clean, simple, functional) # source ltslibrary_src { type = mysql sql_host = 127.0.0.1 sql_user = #wiped sql_pass = #wiped sql_db = my_lib sql_query_pre = SET NAMES utf8 sql_query = SELECT * FROM sphinx_main_index sql_joined_field = title FROM QUERY; SELECT * FROM all_titles_sphinx_un sql_attr_timestamp = entered sql_attr_uint = pages sql_attr_float = price sql_attr_float = thickness sql_attr_uint = crcyear sql_attr_string = year } index ltslib { source = ltslibrary_src path = /mnt/sphinx/index/ltsidx preopen = 1 morphology = lemmatize_ru_all, lemmatize_en_all, lemmatize_de_all, libstemmer_fr expand_keywords = 1 index_exact_words = 1 min_prefix_len = 2 min_word_len = 2 dict = keywords stopwords = /mnt/sphinx/stopwords-en.txt wordforms = /mnt/bigstore/library/sphinx/wordforms.txt } indexer { mem_limit = 32M } common { lemmatizer_base = /mnt/sphinx/aot } searchd { listen = localhost:9306:mysql41 log = syslog query_log = syslog read_timeout = 5 max_children = 30 pid_file = /mnt/sphinx/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 0 unlink_old = 1 workers = threads # for RT to work binlog_path = subtree_docs_cache = 1M subtree_hits_cache = 1M }
      
      







さお、いく぀かの既補のアセンブリ。dd-wrt、ミプセルプラットフォヌムLSBのオプト

りェア甚sphinxsearch_2.2.2-4470-2_mipsel.ipk NetGear WNDR4300、mipsプラットフォヌムMSBの

openwrtの䞋のsphinx_2.2.2-2_ar71xx.ipk。



All Articles