ElasticSearchを使用して、フォーラムスレッドのインデックスを作成し、投稿に返信しています。各投稿には、日付フィールドが関連付けられています。日付範囲に一致する投稿を含むスレッドを返す日付範囲を含むクエリを実行したいと思います。ネストされたマッピングを使用することを検討しましたが、ドキュメントによると、この機能は実験的なものであり、不正確な結果につながる可能性があります。
これを達成するための最良の方法は何ですか?私はJavaAPIを使用しています。
ElasticSearchを使用して、フォーラムスレッドのインデックスを作成し、投稿に返信しています。各投稿には、日付フィールドが関連付けられています。日付範囲に一致する投稿を含むスレッドを返す日付範囲を含むクエリを実行したいと思います。ネストされたマッピングを使用することを検討しましたが、ドキュメントによると、この機能は実験的なものであり、不正確な結果につながる可能性があります。
これを達成するための最良の方法は何ですか?私はJavaAPIを使用しています。
データ構造についてはあまり説明していませんが、質問から、フィールドとおそらくフィールドpost
を含むオブジェクトがあると推測しています。つまり、投稿がどのスレッドに属しているかを特定する方法はありますか?date
thread_id
thread
オブジェクトもありますか、それともthread_id
十分ですか?
いずれにせよ、あなたが述べた目標は、特定の日付範囲に投稿があるスレッドのリストを返すことです。thread_id
これは、スレッドをグループ化する必要があることを意味します(日付範囲内の投稿ごとに同じものを複数回返すのではなく)。
このグループ化は、ファセットを使用して実行できます。
したがって、JSONのクエリは次のようになります。
curl -XGET 'http://127.0.0.1:9200/posts/post/_search?pretty=1&search_type=count' -d '
{
"facets" : {
"thread_id" : {
"terms" : {
"size" : 20,
"field" : "thread_id"
}
}
},
"query" : {
"filtered" : {
"query" : {
"text" : {
"content" : "any keywords to match"
}
},
"filter" : {
"numeric_range" : {
"date" : {
"lt" : "2011-02-01",
"gte" : "2011-01-01"
}
}
}
}
}
}
'
ノート:
search_type=count
実際に投稿を返したくないので使用していthread_id
ます。thread_id
のs(size: 20
)が必要であることを指定しました。デフォルトは10になりますnumeric_range
ため、フィールドにaを使用しているため、この状況でのパフォーマンスが向上します。date
numeric_range
range
thread_id
のように見える場合how-to-perform-a-date-range-elasticsearch-query
は、これらの値を直接使用できます。ただし、別のthread
オブジェクトがある場合は、multi- getAPIを使用してこれらを取得できますthread_id
にマッピングする必要があります{ "index": "not_analyzed" }