4

「twitter_user」と「twitter_comments」という2つのテーブルがあるとします。

twitter_usersには次のフィールドがあります:usernameとbio twitter_commentsには次のフィールドがあります:usernameとcomment

明らかに、ユーザーはtwitter_usersに1つのエントリを持ち、twitter_commentsに多くのエントリを持っている可能性があります

Elastic Searchでtwitter_usersとtwitter_commentsの両方をモデル化したいのですが、コメントがTwitterユーザーの全体的な関連性スコアにカウントされることを知って、クエリ時にESで両方のモデルを検索します。

すべてのコメントを連結した単一の追加フィールド(ユーザー名と略歴に加えて)を作成することで、1つのモデルでこれを模倣できることを私は知っています。しかし、別の「よりクリーンな」方法はありますか?

4

2 に答える 2

8

場合によります。

ユーザーのコメント、全文、およびすべてのフィールドを検索できるようにするだけの場合は、すべてのコメントをユーザーオブジェクト内に格納するだけです(何も連結する必要はありません)。

{
    "user" : {
        "username" : "TestUser",
        "bio" : "whatever",

        "comments" : [
        {
            "title" : "First comment",
            "text" : "My 1st comment"
        },
        {
            "title" : "Second comment",
            "text" : "My 2nd comment"
        }
        ]
    }
}

コメントごとのクエリが必要な場合は、コメントをネストされたものとしてマップする必要があります(データを送信する前に)。これにより、すべてのコメントが単一のアイテムとして扱われます。

スコアリングには、別のフィールド「comment_count」を追加し、これをブースト/スコアリングに使用します。

于 2012-11-17T09:16:11.380 に答える
2

Thorstenがすでに提案しているように、ネストされたクエリを使用できます。これは優れたアプローチです。

または、コメントをユーザーの子としてインデックスに登録することもできます。次に、現在のようにユーザーを検索し、top_childrenクエリを使用してコメントを検索し、検索コメントに関連するすべてを検索し、最後にboolまたはdis_maxクエリを使用して両方のスコアを組み合わせることができます。

ネストされたアプローチは検索中により効率的ですが、コメントが追加されるたびにユーザーとすべてのコメントのインデックスを再作成する必要があります。子/親のアプローチでは、新しいコメントのみにインデックスを付ける必要がありますが、検索が遅くなり、より多くのメモリが必要になります。

于 2012-11-17T13:50:12.613 に答える