23

Elasticsearchには、「類似した」ドキュメントを取得するための2つの類似した機能があります。

「MoreLikeThisAPI」があります。それは私に与えられたものに似た文書を与えてくれます。ただし、これ以上複雑な式では使用できません。

"more_like_this"Search APIで使用するクエリもあり、ブール式またはブースト式で使用できますが、ドキュメントのIDを指定することはできません。パラメータを指定する必要があり"like_text"ます。

タグとコンテンツを含むドキュメントがあります。一部のドキュメントには適切なタグがあり、一部にはタグがありません。毎回機能するが、一致するタグを持つドキュメントを一致するテキストを持つドキュメントよりも上位にランク付けする「類似ドキュメント」機能が必要です。私の考えは:

{
    "boosting" : {
        "positive" : {
            "more_like_this" : {
                "fields" : ["tag"],
                "id" : "23452",
                "min_term_freq" : 1
            }
        },
        "negative" : {
            "more_like_this" : {
                "fields" : ["tag"],
                "id" : "23452",
            }
        },
        "negative_boost" : 0.2
    }
}

にがないため、明らかにこれは機能しませ"id""more_like_this"。選択肢は何ですか?

4

2 に答える 2

46

まず、このような機能とそのしくみについて少し紹介します。アイデアは、特定のドキュメントがあり、それに類似した他のドキュメントが必要であるということです。

これを実現するには、現在のドキュメントからいくつかのコンテンツを抽出し、それを使用して同様のコンテンツを取得するためのクエリを作成する必要があります。lucene に格納されたフィールド (または、事実上 lucene に格納されたフィールドである elasticsearch _source フィールド) からコンテンツを抽出し、何らかの方法で再分析するか、用語ベクトルに格納された情報を使用して (インデックス作成中に有効になっている場合)、用語のリストを取得できます。テキストを再分析することなく、クエリに使用できます。ただし、用語ベクトルが利用可能な場合、elasticsearch がこの後者のアプローチを試みるかどうかはわかりません。

このクエリに似ていると、どこから取得したかに関係なく、テキストを提供できます。そのテキストは、選択したフィールドのクエリに使用され、同様のドキュメントが返されます。テキストは完全には使用されませんが、再分析され、max_query_terms少なくとも指定されたmin_term_freq(最小用語頻度、デフォルト 2) および と の間のドキュメント頻度min_doc_freqを持つ用語のうち、最大 (デフォルト 25) のみが保持されますmax_doc_freq。生成されたクエリに影響を与える可能性のあるパラメーターは他にもあります。

このAPIに似ているほど、さらに一歩進んで、ドキュメントの ID と、フィールドのリストを提供できるようになります。これらのフィールドのコンテンツは、その特定のドキュメントから抽出され、同じフィールドに対してこのようなクエリを作成するために使用されます。つまり、生成されたより似たクエリには、以前に抽出されたテキストを含むプロパティ テキストがあり、同じフィールドで実行されます。ご覧のとおり、この API に似ているほど、この API に似たクエリが内部で実行されます。

このクエリに似ているほど、他のクエリと組み合わせることができ、好きなソースからテキストを取得できるため、柔軟性が向上します。一方、この API に似たものは、いくつかの制限付きで、より多くの作業を行う一般的な機能を公開します。

あなたの場合、このクエリのようないくつかの異なるクエリを組み合わせて、強力なelasticsearchクエリDSLを利用したり、クエリを別の方法でブーストしたりできるようにします。欠点は、テキストを抽出するドキュメントの ID を提供できないため、テキストを自分で提供する必要があることです。

あなたが望むものを達成するためのさまざまな方法があります。bool クエリを使用して、このようなクエリをさらに 2 つ組み合わせて should 句にし、それらに異なる重みを付けます。一度に1 つのフィールドに対してクエリを実行する必要があるため、代わりにこのフィールド クエリのようなものを使用します。

{
    "bool" : {
        "must" : {
          {"match_all" : { }}
        },
        "should" : [
            {
              "more_like_this_field" : {
                "tags" : {
                  "like_text" : "here go the tags extracted from the current document!",
                  "boost" : 2.0
                }
              }
            },
            {
              "more_like_this_field" : {
                "content" : {
                  "like_text" : "here goes the content extracted from the current document!"
                }
              }
            }
        ],
        "minimum_number_should_match" : 1
    }
}

この方法では、should 句の少なくとも 1 つが一致する必要があり、タグの一致はコンテンツの一致よりも重要です。

于 2013-03-10T08:49:23.777 に答える
11

これは新しいlike構文で可能になりました:

{
    "more_like_this" : {
        "fields" : ["title", "description"],
        "like" : [
        {
            "_index" : "imdb",
            "_type" : "movies",
            "_id" : "1"
        },
        {
            "_index" : "imdb",
            "_type" : "movies",
            "_id" : "2"
        }],
        "min_term_freq" : 1,
        "max_query_terms" : 12
    }
}

ここを参照してください: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html

于 2015-07-20T19:41:47.117 に答える