4

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

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

4

1 回答 1

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