いくつかのオプションがあります:
- 検索エンジン開発者(Google、Yandexなど)のウィジェットを使用する:実装が簡単で、使いやすいインターフェイス、形態サポート、辞書修正、検索エンジンによるサイトのインデックス作成の高速化が可能ですが、通常はカスタマイズのオプションとインデックス作成の必然的な遅延が制限されます;
- DBMSに組み込まれたツール(たとえば、 MySQLのFULLTEXTインデックス)を使用します 。実装が非常に簡単で、最新の検索インデックス、構成と外観を完全に制御できますが、多くの場合、大量のデータで非常に低いパフォーマンス、形態の欠如、または最悪の場合ケース、DBMSにそのような資金が完全に存在しない。
- 別のライブラリ/全文検索システムを使用します。
3番目のオプションは、他の2つのオプションの利点を兼ね備えているため、最良のようです。 ここでの真実には欠陥がないわけではありません-ライブラリにはインストールが必要であり、時にはデーモン(たとえばSphinx )を起動することもありますが、これは受け入れられないかもしれません。
多くの解決策があり、それぞれに長所と短所があります。 あまり知られていないXapianライブラリについて詳しく説明したいと思います。
復習
このオープンソース(GPL)クロスプラットフォームライブラリは、Python、PHP、Ruby、Perl、Java、Tcl、およびC#にバインドされたC ++で記述されています。
ライブラリ機能:
- 完全なUnicodeサポート
- ブール検索、ランキングによる検索、マスク、同義語による検索、結果のソートがサポートされています。
- 世界の15言語(ロシア語を含む)のスタミングサポート。
- 辞書クエリ修正サポート(たとえば、 xapainリクエストはxapianに置き換えられます )
- 類似性によるドキュメントの検索。
- すぐに使用できるさまざまな形式(PDF、HTML、RTF、Microsoft Office、OpenDocument、RPM、Debianパッケージなど)のドキュメントのインデックス作成のサポートにより、新しい形式をサポートするフィルターを簡単に追加できます。
ある意味では、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')
インデックス作成のために接続を開くと、新しい(または既存の)検索インデックスデータベースが作成されます。これは、一連のファイルを含むフォルダーです。 データベース形式は、オペレーティングシステムに依存しません。
開いたら、インデックスフィールドのプロパティ(名前、タイプ、その他の属性)を指定する必要があります。
フィールドタイプは次のとおりです。
- INDEX_FREETEXT:テキストはフィールドに保存されます;テキスト自体を保存せずにインデックスを作成するだけです。 このタイプのフィールドについては、追加の属性を指定できます。言語= 'ru'の例では、言語の形態と、ランキング時のフィールドの重み= 5-「重み」を考慮します。
- INDEX_EXACT:単語の正確な値はフィールドに保存され(書籍の識別子などの正確な値の検索に適しています)、テキストはインデックスに保存されます。
- ソート可能:フィールド全体でソートが行われます。 デフォルトでは、保存される内容に関係なく、ソートは辞書式形式になります。 この動作は、type = 'date'属性を使用して日付をソートし(YYYYMMDD、YYYY-MM-DDまたはYYYY / MM / DDの形式)、type = 'float'を使用して実数をソートできます(Pythonでサポートされている任意の形式)。
- COLLAPSE:フィールド全体でグループ化が行われます(たとえば、各カテゴリのリクエストに最も適した1つのドキュメントを見つけるためのSQLのGROUP BYのアナログ)。
- STORE_CONTENT:INDEX_FREETEXTと同様に、テキストのみがインデックスにも保存されます。
ドキュメントを追加するには、次のコードが適しています。
# 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 ブログには、英語の資料もあります。