Sphinx(coreseek)インストール使用および辞書の拡張

18105 ワード

1、Sphinx(coreseek)って何?
一般的に、Sphinxは独立した全文検索エンジンである.Coreseekは中国語をサポートする全文検索エンジンであり、他のアプリケーションに高速、低空間占有、高結果相関度の中国語全文検索能力を提供することを意図している.Sphinx/Coreseekは、SQLデータベースとスクリプト言語の統合を容易にします.
      つまりCoreseekは単独で使用でき、Sphinxを再インストールする必要はありません
2、どこから手に入れるか
    SphinxオリジナルバージョンはSphinx公式サイトより http://www.sphinxsearch.com/CoreseekはCoreseek公式サイトから http://www.coreseek.cn/ダウンロード
3、主な特性
現在、Sphinx/Coreseekのリリースパッケージには、次のソフトウェアが含まれています.indexer:全文インデックスを作成するために使用されます. search:全文インデックスをテストするための簡単なコマンドライン(CLI)のテストプログラム. searchd:1つのデーモンプロセスであり、他のソフトウェアはこのデーモンプロセスを通じて全文検索を行うことができる. sphinxapi:一連のsearchdのクライアントAPIライブラリ、流行のWebスクリプト開発言語(PHP,Python,Perl,Ruby,Java)に用いられる.spelldump:単純なコマンドラインツールで、  ispell  または  MySpell  (OpenOffice内蔵バインディング)形式の辞書から単語を抽出します.使用時 wordforms を使用してインデックスをカスタマイズできます.indextool:インデックスに関する複数のデバッグ情報をダンプするツール・プログラム.このツールは、バージョンCoreseek 3.1(Sphinx 0.9.9-rc 2)から追加されます. mmseg:ツールプログラムとライブラリ、Coreseekは中国語の分詞と辞書処理を提供するために使用されます.
4、Coreseekのインストール
1)ダウンロードしたtarパッケージを解凍し、coreseekに入ります. サブディレクトリ:      
$ tar xzvf coreseek-3.2.14.tar.gz
$ cd coreseek

 
2)まずMMSegをインストールする.
$ cd mmseg

$ ./configure --prefix=/usr/local/mmseg

$ make

$ make install

$ cd ..

3)コンフィギュレーションプログラムを実行する:
$ ./configure

configureプログラムには実行オプションがたくさんあります.完全なリストは、  --help  スイッチが入ります.最も重要なのは次のとおりです.--prefix、Coreseekをどこにインストールするかを定義します.たとえば  --prefix=/usr/local/coreseek  (以下のすべての例はCoreseekがこの位置にインストールされていると仮定する)--with-mysql、自動検出に失敗した場合、そこにMySQLヘッダファイルとライブラリファイルが見つかることを指摘します. --with-pgsql、そこにPostgreSQLヘッダファイルとライブラリファイルが見つかることを指摘します.--with-mmseg,MMSegベースの中国語分詞法を有効にし,そこにMMSegヘッダファイルとライブラリファイルが見つかることを指摘した.--with-python,Pythonデータソースのサポートを有効にする.Python 2.6.を予めインストールする必要がある.
4)ソースコードをコンパイルしてバイナリを生成する:
$ make

$ make install

 
5、Coreseek快速配置
1)プロファイルを作成する.
デフォルトのプロファイル名は  csft.conf.すべてのSphinx/Coreseekが提供するプログラムは、デフォルトでは現在の作業ディレクトリの下でファイルを探しています.configure プログラム生成プロファイル例sphinx.conf.dist のすべてのオプションのコメントを含んで、このファイルをコピーして編集してあなたの具体的な情況に適用します:(Sphinx/Coreseekがインストールすることを確認してください  /usr/local/coreseek/ )
$ cd /usr/local/coreseek/etc
$ cp sphinx.conf.dist csft.conf
$ vi csft.conf

 
coreseekプロファイル解析:
  • source:データソース、データはどこから来たのですか.
  • index:インデックス.データソースがある場合、データソースからインデックスを構築します.インデックスは実際には辞書検索に相当します.辞書全体の内容があれば、辞書検索があります.
  • searchd:検索クエリーサービスを提供します.通常はdeamonの形式でバックグラウンドで実行されます.
  • indexer:インデックスを構築するサービス.インデックスを再構築する場合はindexerというコマンドを呼び出します.
  • attr:属性、属性はインデックスに存在し、全文インデックスは行われませんが、フィルタリングおよびソートに使用できます.

  • ソース情報の詳細は、公式ドキュメントを参照してください.http://www.coreseek.cn/products-install/datasource/
    #   
    source xml
    {
        type                    = xmlpipe2
        xmlpipe_command = bin\cat var/test/test.xml     #               xml  
    }
    
    #index  
    index xml
    {
        source            = xml             #   source  
        path            = var/data/xml
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
        #charset_dictpath = /usr/local/mmseg3/etc/    #BSD、Linux     ,/    
        charset_dictpath = etc/                        #Windows     ,/    
        charset_type        = zh_cn.utf-8
    }

     
    2)運転indexer データの全文インデックスを作成します.
    $ cd /usr/local/coreseek/etc
    $ /usr/local/coreseek/bin/indexer --all

    3)テスト索引:
    $ cd /usr/local/coreseek/etc
    $ /usr/local/coreseek/bin/search test

    または
    /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf      

     
     
    6、PHPコードでインデックスを呼び出す
    1)デーモンプロセスsearchdを実行し、PHPスクリプトはsearchdに接続して検索する必要がある:
    $ cd /usr/local/coreseek/etc
    $ /usr/local/coreseek/bin/searchd

    2)PHP APIに付属のtestスクリプトを実行します(実行前にsearchdデーモンが起動していることを確認してください):
    $ cd /     /coreseek/api
    $ php test.php test

    もちろん、coreseekのapiインタフェースファイルを直接含む方法でインデックスを呼び出すこともできますが、sphinxのphp拡張子をインストールすることで呼び出すこともできます(クライアントバージョンとサービスエンドバージョンは一致しています).
    テストコードは次のとおりです.
    $sphinx = new SphinxClient();
    $sphinx->SetServer ( 'x.x.x.x', 9312 );
    $sphinx->SetArrayResult ( true );//        php    
    // $sphinx->SetLimits(0, 20, 1000);//        ,        :    ,      ,      
    
    //      
    // $sphinx->SetMaxQueryTime(10);
    
    //           index  ,           ,   :'email,diary'     '*'        
    $index = 'index'; 
    $sphinx->setMatchMode(SPH_MATCH_ALL);  
    // $sphinx->setMaxQueryTime(30);                             //            
    // $sphinx->SetArrayResult(false);                           //   Matches key ID      
    // $sphinx->SetSelect ( "*" );                               //         ,   SQL    
    // $sphinx->SetRankingMode(SPH_RANK_BM25);                   //      ,SPH_RANK_BM25                  。  
    
    
    $result = $sphinx->query("  ", $index); 
    $err = $sphinx->GetLastError();   
    
    
    echo '<pre>';
    print_r($result);
    print_r($err);
    echo '</pre>';

     
    6、拡張辞書
    coreseekは中国語の辞書を持っていますが、基礎的な辞書なので、業界の辞書が必要な場合は、自分で辞書を拡張することができます.
    1)まず検索犬に辞書をダウンロードします.http://pinyin.sogou.com/dict/
    2)辞書をテキストファイルに変換
         ネット上で犬を探してgoogleを回す小さなツールを探して、それを使ってあなたがダウンロードしたすべての辞書を文本ファイルに変えて、1つのファイルにwords.txtと名付けます.ファイルはutf 8符号化で保存します.
         自分で変換したい場合は、公式サイトの方法を参照してください.http://www.coreseek.cn/opensource/mmseg/
    3)テキストファイルを辞書形式に変換する
         今、初歩的な辞書がありますが、この辞書はまだ直接使用できません.coreseekが使用しているフォーマットを整理して変換しなければなりません.PHPコードで変換します.
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    date_default_timezone_set ('Asia/Shanghai');
    set_time_limit(0);
    
    $buffer    = ini_get('output_buffering');
    if($buffer){
        ob_end_flush();
    }
    
    echo '     ...'.PHP_EOL;
    flush();
    $filename     = "words.txt";
    $handle     = fopen ($filename, "r");
    $content     = fread ($handle, filesize ($filename));
    fclose ($handle);
    
    $content    =    trim($content);
    $arr1         =     explode( "\r
    " ,$content ); $arr1 = array_flip(array_flip($arr1)); foreach($arr1 as $key=>$value){ $value = dealchinese($value); if(!empty($value)){ $arr1[$key] = $value; }else{ unset($arr1[$key]); } } echo ' ...'.PHP_EOL; flush(); $filename2 = "unigram.txt"; $handle2 = fopen ($filename2, "r"); $content2 = fread ($handle2, filesize ($filename2)); fclose ($handle2); $content2 = dealchinese($content2,"\r
    "); $arr2 = explode( "\r
    " ,$content2 ); echo ' ...'.PHP_EOL; flush(); $array_diff = array_diff($arr1,$arr2); echo ' ...'.PHP_EOL; flush(); $words=''; foreach($array_diff as $k => $word){ $words .= $word."\t1".PHP_EOL."x:1".PHP_EOL; } //echo $words; file_put_contents('words_new.txt',$words,FILE_APPEND); echo 'done!'; function dealChinese($str, $join=''){ preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str, $matches); // $str = join($join, $matches[0]); // return $str; }

     
    4)新しい辞書を生成する
    実行後、同じディレクトリでwordsを生産します.新w.txtこのファイルを元のunigram.txtの後ろに追加し、スタンバイを保存します.
    上記のファイルunigram.txtを/usr/local/mmseg-3.2.14/etc/にコピーします.
    cd  /usr/local/mmseg-3.2.14/etc/
    /usr/local/mmseg-3.2.14/bin/mmseg -u unigram.txt 

    このコマンドを実行すると、unigram.txtが存在するディレクトリにunigram.txt.uniというファイルが生成され、そのファイルをuni.libと改名し、辞書の構造が完了します.
     
    5)新しい辞書のテスト
    テストファイルtest.txtを新規作成し、テストするテキストを書き込みます.
    /usr/local/mmseg-3.2.14/bin/mmseg -d  /usr/local/mmseg-3.2.14/etc/ test.txt

    つまり
    mmseg -d <dict_dir> test.txt

    ここで、コマンドは「-d」スイッチを使用して辞書ファイルの場所を指定し、パラメータdict_dirは辞書ファイル(uni.lib)が存在するディレクトリである.text.txtは分割するテキストファイルであり、UTF-8で符号化する必要があります.すべてが正しい場合、mmsegは分割結果と所要時間を標準出力に表示します.
     
     
    7、coreseek常用コマンド
      
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
      
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf --stop
        
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all
        
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate