PythonでXapian全文検索ライブラリを使用する

今日、Web 2.0の時代には、サイトにコンテンツが増えているため、開発者は全文検索を実装するという課題に直面しています。



いくつかのオプションがあります:



3番目のオプションは、他の2つのオプションの利点を兼ね備えているため、最良のようです。 ここでの真実には欠陥がないわけではありません-ライブラリにはインストールが必要であり、時にはデーモン(たとえばSphinx )を起動することもありますが、これは受け入れられないかもしれません。



多くの解決策があり、それぞれに長所と短所があります。 あまり知られていないXapianライブラリについて詳しく説明したいと思います。



復習



このオープンソース(GPL)クロスプラットフォームライブラリは、Python、PHP、Ruby、Perl、Java、Tcl、およびC#にバインドされたC ++で記述されています。



ライブラリ機能:



ある意味では、Xapianの主な欠点は、C ++以外のプログラミング言語へのバインディングです。 SWIGはバインディングコードの生成に使用されるため、その中のAPIはC ++のバージョンのAPIと完全に一致します



幸いなことにPythonには、すべての汚い作業を処理するシンプルで効果的なXappyラッパーがあります。



設置



最初のステップは、PythonとXappyにバインドしてXapian自体をインストールすることです。 ほとんどのGNU / Linuxディストリビューションのリポジトリにはすでに必要なパッケージがすべて含まれています。たとえば、Ubuntu 10.10では、パッケージをインストールする必要があります。

sudo apt-get install libxapian15 python-xapian python-xappy
      
      





Xappyはeasy_installまたはpipからも利用できます:

 sudo pip install xappy
      
      





索引付け



何かにインデックスを付けてみましょう:

 import xappy #         #        connection = xappy.IndexerConnection('/path/to/base') #    connection.add_field_action( 'title', xappy.FieldActions.INDEX_FREETEXT, weight=5, language='ru') connection.add_field_action( 'description', xappy.FieldActions.INDEX_FREETEXT, language='ru')
      
      





インデックス作成のために接続を開くと、新しい(または既存の)検索インデックスデータベースが作成されます。これは、一連のファイルを含むフォルダーです。 データベース形式は、オペレーティングシステムに依存しません。



開いたら、インデックスフィールドのプロパティ(名前、タイプ、その他の属性)を指定する必要があります。



フィールドタイプは次のとおりです。



ドキュメントを追加するには、次のコードが適しています。

 #    doc = xappy.UnprocessedDocument() #   doc.fields.append(xappy.Field('title', '  ')) doc.fields.append(xappy.Field('description', '  ')) #    connection.add(doc)
      
      





各ドキュメントには一意の識別子が必要です。上記の例では自動的に追加されますが、独自の識別子を指定できます。

 #      for posts_item in posts: doc = xappy.UnprocessedDocument() #       #    ! doc.id = posts_item.id doc.fields.append(xappy.Field('title', posts_item.title)) doc.fields.append(xappy.Field('description', posts_item.description) connection.add(doc)
      
      





ドキュメントを追加した後、すべての変更をディスクに書き込み、接続を閉じる必要があります。

 connection.flush() connection.close()
      
      





これで、インデックスが作成されました!



検索する



既存のインデックスを検索するには、接続を開いて検索インデックスのデータベースを検索する必要があります。

 import xappy #         #        connection = xappy.SearchConnection('/path/to/base')
      
      





検索接続が開かれた後に新しいドキュメントがインデックス付けされたときに、状況が発生する可能性があります。 この場合、現在のデータベースにアクセスするには、接続を再度開く必要があります。

 connection.reopen()
      
      





検索クエリ( SearchConnectionクラス)を実行する方法はいくつかありますが、最も単純なのはquery_parseです:

 #    query = connection.query_parse('') #    10  #      10, 20  .. results = connection.search(query, 0, 10) # -  if results.matches_estimated > 0: for results_item in results: print(results_item.rank, results_item.id) else: print('  ')
      
      





タイプSTORE_CONTENTまたはINDEX_EXACTのフィールドの場合、その内容を表示できます。これにより、たとえば、メインデータベースからIDで選択したレコードを選択するのではなく、検索インデックスのみを実行できます。

 for results_item in results: print(results_item.data['title'])
      
      







関連リンク



もちろん、これはXapianの能力からはほど遠いものです。 これらの機能やその他の機能については、Xappy 0.5のドキュメントで詳しく説明されています。また、Xapianの公式ドキュメントを参照することもできます。 この Xapian ブログには、英語の資料もあります。




All Articles