質問
「書籍検索」を構築していますLuceneを使用したAPI。 LuceneインデックスのBook Name、Author、およびBookカテゴリのフィールドにインデックスを付ける必要があります。
単一の本は、複数の異なる本のカテゴリに分類できます。例:
BookName1-フィクション、ユーモア、哲学。 BookName1-フィクション、科学。 BookName1-ユーモア、ビジネス。 BookName4-ユーモア などなど.......
ユーザーは、特定のカテゴリ(「名誉」)の下にあるすべての書籍を検索できる必要があります。
この状況を考えると、フィールドの上のインデックスを作成し、luceneでクエリを作成するにはどうすればよいですか
解決
Luceneドキュメントのフィールドを複数回出現させることができます。ドキュメントを作成し、名前と作成者の値を追加してから、各カテゴリに対して同じことを行います
- 新しいluceneドキュメントを作成
- 名前フィールドと値を追加
- 著者フィールドと値を追加
- 各カテゴリ:
- カテゴリフィールドと値を追加
- インデックスにドキュメントを追加
カテゴリのインデックスを検索すると、目的の値を持つカテゴリフィールドを持つすべてのドキュメントが返されます。カテゴリは「キーワード」フィールドである必要があります。
特定のコードはluceneバージョンごとに若干異なるため、英語で作成しました。
他のヒント
簡単な「カテゴリ」を作成できます。フィールド。スペースで区切られた本のすべてのカテゴリをリストします。
その後、次のようなものを検索できます:
stock market AND category:(+"business")
または複数のカテゴリで検索する場合
stock market AND category:(+"business" +"philosophy")
代わりに Solr を使用します-Lucene上に構築され、ASFによって管理されますが、 Luceneよりもはるかに使いやすく、特に新規参入者にとっては。
Luceneのほとんどすべてのメインライン機能(説明するプロジェクトに必要なものすべて)に加えて、スナップショット、レプリケーション、スキーマなどの追加機能を提供する場合...
Solrでは、インデックスを作成するフィールドを schema.xml
で次のように定義するだけです。
<field name="book_id" type="string" indexed="true" stored="true" required="true" multiValued='false'/>
<field name="book_name" type="text" indexed="true" stored="true" required="true" multiValued='false' />
<field name="book_authors" type="text" indexed="true" stored="true" required="true" multiValued='true' />
<field name="book_categories" type="textTight" indexed="true" stored="true" required="true" multiValued='true' />
multiValued = 'true'
属性を使用すると、このフィールドに配列またはリストを効果的に渡すことができ、Solrによって適切に分割およびインデックス化されます。
これを入手したら、Solrを起動すると、&quot; book_authors:Hemingway
&quot;のようなクエリを実行できます。または&quot; book_categories:Romance book_categories:Mills
&quot;。
複雑なクエリの解析(ファジーマッチ、ブール演算、スコアリングブーストなど)を実行するために事前に記述および構成されたクエリハンドラがいくつかあり、SolrのAPIがHTTPで公開されるため、これらはすべてラップされます多数のクライアントライブラリにより、クエリを作成するための低レベルの詳細を自分で処理する必要はありません。