Xapian学習ノート1紹介


Xappian紹介 
--------
1.簡単に紹介する
   Xapianはオープンソースの検索エンジンライブラリで、C++で作成され、GPLプロトコルを許可します.http://www.opensource.org/licenses/gpl-license.php)Perl、python、PHP、Javaなどの言語と結合して使用できます.
   Luceneと同じように、Xapianは検索エンジンのツールライブラリだけで、ユーザーは自分でその適切なアプリケーションを拡張することができます.これは確率モデルに基づいて、スコア計算の基本として、もちろん、それは豊富なBooleanクエリ機能を提供します.
   Xapianをあなたのウェブサイトに使用したいなら、Xapianのセットを使ってもいいです.Omegaはあなたの大部分の需要を満たすことができます.もちろん、その拡張性はいいです.
   現在Xpianの安定バージョンは1.2.10で、
2.機能紹介
   次はXpianの主な機能点です.
  •    × オープンソース、GPLプロトコルに基づく
  •    × Unicodeをサポートしています.インデックスデータを保存するのもUTF-8
  • です.
  •    × 移植可能性は、Linux、Mac Os X、Windowsシステム
  • で実行できます.
  •    × 複数の言語の結合をサポートしています.現在はPerl、python、java、PHP、C氡などの
  • があります.
  •    × 概念モデルをクエリスコア計算の基礎とする
  •    × 関連度のフィードバックでは、Xapianは、ユーザの照会条件に基づいて、関連するフレーズまたはドキュメント、または関連する文書の種類
  • を返すことができる.
  •    × フレーズと類似語クエリ、ユーザーのクエリー条件は、フレーズ内の単語の出現順序、出現回数などの条件を指定できます.
  •    × Booleanクエリをサポートしています.例えば、「A NOT B」のように、Booleanクエリ結果の順序付けは確率モデルに基づいています.
  •    × サポートワードの検索
  •    × プレフィックスクエリをサポートします.Xap*
  • のようです.
  •    × 類義語の検索をサポートします.
  •    × ユーザクエリ条件に基づくスペルチェックをサポートします.
  •    × ファミコン検索に対応します.http://xapian.org/docs/facets
  •    × 2 GB以上のデータファイルをサポートする
  •    × プラットフォームと独立したインデックス形式で、linuxの下でインデックスを作成して、インデックスファイルをwindowsマシンにコピーしても、
  • を検索できます.
  •    × 同期更新とクエリーをサポートします.新しい文書はすぐに
  • に照会できます.
    Xapianはまた、CGIクエリーアプリケーションを提供しています.Omegaは、次のような特徴があります.
  •    × インデックスフォーマットはHTML、PHP、PDF、PostScriptなどに対応しています.また、そのfiltersを通じて定義された索引形式からもできます.
  •    × Perl DBI moduleを使用して、MySql、PstgreSQL、SQLite、OracleなどのSQLに対するインデックスをサポートすることができます.
  •    × CGIはいい拡張性があります.XMLとCSVのカスタマイズ出力に対応できます.
  • 3.一例
       3.1 linuxでのインストール       uuntuやdebianの下で使えます.
       
        $ sudo apt-get install python-xapian
        $ sudo apt-get install libxapian-dev
           をインストールしたり,ソースコードからコンパイルしたり,インストールしたりします.
       3.2インデックスの作成       
    #include <xapian.h>      //    
    
    
    #include <iostream>
    #include <string>
    
    
    #include <cstdlib> // For exit().
    #include <cstring>
    
    
    using namespace std;
    
    
    int
    main(int argc, char **argv)
    try {
        if (argc != 2 || argv[1][0] == '-') {
    	int rc = 1;
    	if (argv[1]) {
    	    if (strcmp(argv[1], "--version") == 0) {
    		cout << "simpleindex" << endl;
    		exit(0);
    	    }
    	    if (strcmp(argv[1], "--help") == 0) {
    		rc = 0;
    	    }
    	}
    	cout << "Usage: " << argv[0] << " PATH_TO_DATABASE
    " "Index each paragraph of a text file as a Xapian document." << endl; exit(rc); } // Open the database for update, creating a new database if necessary. // Xapian::WritableDatabase db(argv[1], Xapian::DB_CREATE_OR_OPEN); // Xapian::TermGenerator indexer; Xapian::Stem stemmer("english"); indexer.set_stemmer(stemmer); string para; while (true) { string line; if (cin.eof()) { if (para.empty()) break; } else { getline(cin, line); } if (line.empty()) { if (!para.empty()) { // We've reached the end of a paragraph, so index it. // Xapian::Document doc; doc.set_data(para); // , , , URI, // , indexer.set_document(doc); indexer.index_text(para); // Add the document to the database. // db.add_document(doc); para.resize(0); } } else { if (!para.empty()) para += ' '; para += line; } } // Explicitly commit so that we get to see any errors. WritableDatabase's // destructor will commit implicitly (unless we're in a transaction) but // will swallow any exceptions produced. db.commit(); } catch (const Xapian::Error &e) { cout << e.get_description() << endl; exit(1); }
       3.3クエリ
    	
    #include <xapian.h>
    
    
    #include <iostream>
    #include <string>
    
    
    #include <cstdlib> // For exit().
    #include <cstring>
    
    
    using namespace std;
    
    
    int
    main(int argc, char **argv)
    try {
        // We require at least two command line arguments.
        if (argc < 3) {
    	int rc = 1;
    	if (argv[1]) {
    	    if (strcmp(argv[1], "--version") == 0) {
    		cout << "simplesearch" << endl;
    		exit(0);
    	    }
    	    if (strcmp(argv[1], "--help") == 0) {
    		rc = 0;
    	    }
    	}
    	cout << "Usage: " << argv[0] << " PATH_TO_DATABASE QUERY" << endl;
    	exit(rc);
        }
    
    
        // Open the database for searching.
        //     
        Xapian::Database db(argv[1]);
    
    
        // Start an enquire session.
        //       
        Xapian::Enquire enquire(db);
    
    
        // Combine the rest of the command line arguments with spaces between
        // them, so that simple queries don't have to be quoted at the shell
        // level.
        string query_string(argv[2]);
        argv += 3;
        while (*argv) {
    	query_string += ' ';
    	query_string += *argv++;
        }
    
    
        // Parse the query string to produce a Xapian::Query object.
        //        
        Xapian::QueryParser qp;
        Xapian::Stem stemmer("english");
        qp.set_stemmer(stemmer);
        qp.set_database(db);
        qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
        try
        //       
        Xapian::Query query = qp.parse_query(query_string);
        cout << "Parsed query is: " << query.get_description() << endl;
    
    
        // Find the top 10 results for the query.
        //                ,
        enquire.set_query(query);
        //       
        Xapian::MSet matches = enquire.get_mset(0, 10);
    
    
        // Display the results.
        cout << matches.get_matches_estimated() << " results found.
    "; cout << "Matches 1-" << matches.size() << ":
    " << endl; // for (Xapian::MSetIterator i = matches.begin(); i != matches.end(); ++i) { cout << i.get_rank() + 1 << ": " << i.get_percent() << "% docid=" << *i << " [" << i.get_document().get_data() << "]

    "; } } catch (const Xapian::Error &e) { cout << e.get_description() << endl; exit(1); }
    4.参考http://xapian.org/