在elasticsearch中按日期获取上一个和下一个文档

xj3cbfub  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(433)

我的elasticsearch索引包含每个文档都有一个日期字段。文件可以按日期排序。
假设我有一个特定的文档id和它的日期,那么按日期获取索引中的上一个和下一个文档的最佳方法是什么?
我看过带日期的模糊查询,但它不能直接解决问题。它将返回最相似的文档,但不一定返回上一个和下一个文档。

jhdbpxl9

jhdbpxl91#

这里有一种方法,但需要两个请求。为了进行测试,我定义了一个简单的索引并添加了一些文档:

  1. PUT /test_index
  2. {
  3. "settings": {
  4. "number_of_shards": 1
  5. },
  6. "mappings": {
  7. "doc": {
  8. "properties": {
  9. "doc_date": {
  10. "type": "date",
  11. "format": "YYYY-MM-dd"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. POST /test_index/doc/_bulk
  18. {"index":{"_id":1}}
  19. {"doc_date":"2015-5-21"}
  20. {"index":{"_id":3}}
  21. {"doc_date":"2015-5-22"}
  22. {"index":{"_id":2}}
  23. {"doc_date":"2015-5-23"}
  24. {"index":{"_id":4}}
  25. {"doc_date":"2015-5-24"}
  26. {"index":{"_id":6}}
  27. {"doc_date":"2015-5-25"}
  28. {"index":{"_id":5}}
  29. {"doc_date":"2015-5-26"}

现在我可以选择一个日期了 "2015-5-23" ,然后像这样得到下一个医生:

  1. POST /test_index/_search
  2. {
  3. "size": 1,
  4. "query": {
  5. "constant_score": {
  6. "filter": {
  7. "range": {
  8. "doc_date": {
  9. "gt": "2015-5-23"
  10. }
  11. }
  12. }
  13. }
  14. },
  15. "sort": [
  16. {
  17. "doc_date": {
  18. "order": "asc"
  19. }
  20. }
  21. ]
  22. }
  23. ...
  24. {
  25. "took": 2,
  26. "timed_out": false,
  27. "_shards": {
  28. "total": 1,
  29. "successful": 1,
  30. "failed": 0
  31. },
  32. "hits": {
  33. "total": 3,
  34. "max_score": null,
  35. "hits": [
  36. {
  37. "_index": "test_index",
  38. "_type": "doc",
  39. "_id": "4",
  40. "_score": null,
  41. "_source": {
  42. "doc_date": "2015-5-24"
  43. },
  44. "sort": [
  45. 1432425600000
  46. ]
  47. }
  48. ]
  49. }
  50. }

前一个是这样的:

  1. POST /test_index/_search
  2. {
  3. "size": 1,
  4. "query": {
  5. "constant_score": {
  6. "filter": {
  7. "range": {
  8. "doc_date": {
  9. "lt": "2015-5-23"
  10. }
  11. }
  12. }
  13. }
  14. },
  15. "sort": [
  16. {
  17. "doc_date": {
  18. "order": "desc"
  19. }
  20. }
  21. ]
  22. }
  23. ...
  24. {
  25. "took": 1,
  26. "timed_out": false,
  27. "_shards": {
  28. "total": 1,
  29. "successful": 1,
  30. "failed": 0
  31. },
  32. "hits": {
  33. "total": 2,
  34. "max_score": null,
  35. "hits": [
  36. {
  37. "_index": "test_index",
  38. "_type": "doc",
  39. "_id": "3",
  40. "_score": null,
  41. "_source": {
  42. "doc_date": "2015-5-22"
  43. },
  44. "sort": [
  45. 1432252800000
  46. ]
  47. }
  48. ]
  49. }
  50. }

不知道如何在一次请求中立即完成。我会考虑一下的。
以下是我用于测试的代码:
http://sense.qbox.io/gist/ffeda4baeafac27dcc11e2010594015c98e6d40f

展开查看全部

相关问题