如何根据每个文档的多个日期执行日期范围elasticsearch查询?

时间:2011-11-11 19:04:10

标签: elasticsearch

我正在使用ElasticSearch索引论坛帖子并回复帖子。每个帖子都有一个与之关联的日期字段。我想执行一个包含日期范围的查询,该日期范围将返回包含与日期范围匹配的帖子的主题。我已经看过使用嵌套映射,但文档说该功能是实验性的,可能会导致不准确的结果。

实现这一目标的最佳方法是什么?我正在使用Java API。

1 个答案:

答案 0 :(得分:12)

您没有详细说明您的数据结构,但我从您的问题推断您有post个包含date字段的对象,并且可能是thread_id字段,即识别帖子属于哪个帖子的某种方式?

您是否还有thread个对象,或者thread_id是否足够?

无论哪种方式,您声明的目标是返回在特定日期范围内有帖子的帖子列表。这意味着您需要对线程进行分组(而不是为日期范围内的每个帖子多次返回相同的thread_id)。

可以使用facets完成此分组。

所以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 s
  • 我已经指定我想要最常遇到的20个thread_idsize: 20)。默认值为10
  • 我在numeric_range字段中使用date,因为日期通常有许多不同的值,而numeric_range过滤器使用不同的range过滤器方法,在这种情况下使其表现更好
  • 如果thread_id看起来像how-to-perform-a-date-range-elasticsearch-query,那么您可以直接使用这些值。但是,如果您有一个单独的thread对象,那么您可以使用multi-get API来检索这些
  • 您的thread_id字段应映射为{ "index": "not_analyzed" },以便将整个值视为单个字词,而不是分析为单独的字词