4

ElasticSearchを使用して、フォーラムスレッドのインデックスを作成し、投稿に返信しています。各投稿には、日付フィールドが関連付けられています。日付範囲に一致する投稿を含むスレッドを返す日付範囲を含むクエリを実行したいと思います。ネストされたマッピングを使用することを検討しましたが、ドキュメントによると、この機能は実験的なものであり、不正確な結果につながる可能性があります。

これを達成するための最良の方法は何ですか?私はJavaAPIを使用しています。

4

1 に答える 1

12

データ構造についてはあまり説明していませんが、質問から、フィールドとおそらくフィールドpostを含むオブジェクトがあると推測しています。つまり、投稿がどのスレッドに属しているかを特定する方法はありますか?datethread_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ます。
  • 最も頻繁に遭遇する20個thread_idのs(size: 20)が必要であることを指定しました。デフォルトは10になります
  • 日付には通常多くの異なる値があり、フィルターはフィルターに対して異なるアプローチを使用するnumeric_rangeため、フィールドにaを使用しているため、この状況でのパフォーマンスが向上します。datenumeric_rangerange
  • thread_idのように見える場合how-to-perform-a-date-range-elasticsearch-queryは、これらの値を直接使用できます。ただし、別のthreadオブジェクトがある場合は、multi- getAPIを使用してこれらを取得できます
  • フィールドは、個別の用語に分析されるのではなく、値全体が単一の用語として扱われるようthread_idにマッピングする必要があります{ "index": "not_analyzed" }
于 2011-11-12T12:10:10.543 に答える