3

ハッシュタグ検索を構築していると想像してください。私のメインのインデックス付きタイプは Post と呼ばれ、IndexedEmbedded としてマークされた Hashtag アイテムのリストがあります。これとは別に、すべての投稿には Comment オブジェクトのリストがあり、それぞれに Hashtag オブジェクトのリストが含まれています。

検索側では、次のようなネストされたフィールドを含む、可能な検索フィールドの長いリストを渡す MultiFieldQueryParser を使用しています。

hashTags.valuecoments.hashTags.value

さて、#architecture など、何かを検索したいときに興味深いことが起こります。ハッシュタグがどこにあるかを把握したので、論理的に最も単純なことは、タイプ #architecture のクエリをタイプ #architecture のいずれかに変換することhashTags.value:architecture or comments.hashTags.value:architectureです。可能ですが、これは非常に柔軟性に欠けます。ハッシュタグを含む別のフィールドを見つけたらどうしますか? 私もそれを含めなければなりません。

これを行う一般的な方法はありますか?

PS私が探しているルートタイプはPostであることを覚えておいてください。これは私が達成したい結果の種類だからです

4

2 に答える 2

5

ハッシュタグはキーワードであり、テキスト分析を Lucene に処理させて、メイン テキストからハッシュタグを抽出し、カスタム フィールドに保存する必要があります。

Hibernate Search を使用して、2 つの異なる@Fieldで(@Fields アノテーションを使用して)インデックス付けされるようにテキストを定義することで、これを非常に簡単に行うことができます。コメントという名前の 1 つのフィールドと、別のコメントハッシュタグを持つことができます。

次に、カスタム アナライザーをcommentsHashtagsに適用します。これは、標準的なトークン化を行い、 #で始まらない用語を破棄します。標準のトークナイザーを使用してカスタム フィルターを適用することで、簡単に定義できます。

クエリを実行するとき、クエリ入力でハッシュタグを探すためにカスタム コードを記述する必要はありません。同じアナライザー (これがデフォルトです) で処理し、両方のフィールドをターゲットにします。ハッシュタグをブーストすることもできます。それが理にかなっていればもっと。

このソリューションを使用すると、

  • 検索のテキスト分析の高効率を利用する
  • ハッシュタグを含むデータベース上のエンティティとテーブルを避ける: 無駄なオーバーヘッド
  • フリーテキスト抽出をいじらないようにする

これにより、もう 1 つの強力なポイントが得られます。次に、未加工の IndexReader を開き、 commentsHashtagsから termvector をロードして、使用されているすべてのタグのリストとそれらに関するメトリックの両方を取得できます。データマイニングを行うか、タグクラウドを視覚化するのはクールです。

于 2012-10-04T11:15:40.223 に答える
1

フィールドを別のものとして扱い、トップレベルのドキュメントを投稿として扱う代わりに、投稿コメントの両方を Lucene ドキュメントとして保存してみませんか? そうすれば、「ハッシュタグ」と呼ばれる 1 つのフィールドだけを検索することができます。コメントと投稿を区別するために、「タイプ」または何かと呼ばれるフィールドも必要です。

検索結果は、投稿のコメントのいずれかになります。ユーザーが投稿またはコメントのみを検索したい場合は、タイプでフィルタリングできます。または、UI で別の方法で表示することもできます。

ハッシュタグも使用する別の概念を追加したい場合 (... わからない... splanks や、将来インターネット通信に付けられるばかげた名前など)、既存の Post および Comment ドキュメントと一緒に簡単に追加できます。 「ハッシュタグ」フィールドを使用して新しいタイプのインデックスを作成します。とにかく、splanks を追加するには多くの作業を行う必要があるため、その新しいタイプの検索結果のハンドラーを追加することはそれほど不便ではありません。

于 2012-10-15T21:48:56.933 に答える