まず、このような機能とそのしくみについて少し紹介します。アイデアは、特定のドキュメントがあり、それに類似した他のドキュメントが必要であるということです。
これを実現するには、現在のドキュメントからいくつかのコンテンツを抽出し、それを使用して同様のコンテンツを取得するためのクエリを作成する必要があります。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 つが一致する必要があり、タグの一致はコンテンツの一致よりも重要です。