【问题标题】:ElasticSearch. Select by date range in array of dates and sort by matching dates弹性搜索。在日期数组中按日期范围选择并按匹配日期排序
【发布时间】:2020-09-22 21:23:19
【问题描述】:

每个文档都有多个日期。 我想选择具有日期范围的文档(任何日期都适合该范围 - 文档匹配)。这部分有效。 我想按日期对所选文档进行排序,但排序包括所有日期,而不仅仅是匹配的日期。

例如

doc 1
        "1990-01-01",
        "2000-01-01",
        "2000-01-02",
        "2020-01-01"

doc 2
        "1990-01-01",
        "2000-05-01",
        "2020-01-01"

doc 3
        "1990-01-01",
        "2000-03-01",
        "2020-01-01"
doc 4
        "1990-01-01",
        "2002-03-01",
        "2020-01-01"

如果我选择范围

                  "gte": "1991-03-01",
                  "lte": "2001-03-01"

然后doc 1doc 2doc 3 匹配它。

如果我按日期排序,我希望看到asc(我希望参与排序的日期)

doc 1 -> 2000-01-01 doc 3 -> 2000-03-01 doc 2 -> 2000-05-01

但它似乎使用最早的日期,因此排序不会影响它。

在这里我附上我尝试做的测试数据:

DELETE my-index-000001

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "dtmSent": {
        "type": "nested",
        "properties" : {
            "dtmSent" : {
                "type" : "date"
            }
        }

      }
    }
  }
}
PUT my-index-000001/_doc/1
{
  "dtmSent" : [
    {
      "dtmSent" : [
        "1990-01-01",
        "2000-01-01",
        "2000-01-02",
        "2020-01-01"
      ]
    }
  ]
}
PUT my-index-000001/_doc/2
{
  "dtmSent" : [
    {
      "dtmSent" : [
        "1990-01-01",
        "2000-05-01",
        "2020-01-01"
      ]
    }
  ]
}
PUT my-index-000001/_doc/3
{
  "dtmSent" : [
    {
      "dtmSent" : [
        "1990-01-01",
        "2000-03-01",
        "2020-01-01"
      ]
    }
  ]
}
PUT my-index-000001/_doc/4
{
  "dtmSent" : [
    {
      "dtmSent" : [
        "1990-01-01",
        "2002-03-01",
        "2020-01-01"
      ]
    }
  ]
}

GET /my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "dtmSent",
      "query": {
        "bool": {
          "must": [
            {
              "range": {
                "dtmSent.dtmSent": {
                  "gte": "1991-03-01",
                  "lte": "2001-03-01"
                }
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "dtmSent.dtmSent": {
        "order": "asc",
        "nested": {
          "path" : "dtmSent",
          "filter" :{
            "range": {
              "dtmSent.dtmSent": {
                "gte": "1991-03-01",
                "lte": "2001-03-01"
              }
            }
          }
        }
      }
    }
  ]
}

请指教我错过了什么。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您的文档格式有些不正确。如果你想要适当的嵌套,你需要像这样重构它们:

    {
      "dtmSent":[
        {
          "dtmSent":"1990-01-01"
        },
        {
          "dtmSent":"2000-05-01"
        },
        {
          "dtmSent":"2020-01-01"
        }
      ]
    }
    

    而不是字符串数组。

    索引映射可以保持不变,查询和排序部分也是一样。之后,订单将按您的预期工作1 -> 3 -> 2

    删除索引后,下面是 _bulk 命令让你开始(当然只有在设置映射之后):

    POST _bulk
    {"index":{"_index":"my-index-000001","_type":"_doc","_id":1}}
    {"dtmSent":[{"dtmSent":"1990-01-01"},{"dtmSent":"2000-01-01"},{"dtmSent":"2000-01-02"},{"dtmSent":"2020-01-01"}]}
    {"index":{"_index":"my-index-000001","_type":"_doc","_id":2}}
    {"dtmSent":[{"dtmSent":"1990-01-01"},{"dtmSent":"2000-05-01"},{"dtmSent":"2020-01-01"}]}
    {"index":{"_index":"my-index-000001","_type":"_doc","_id":3}}
    {"dtmSent":[{"dtmSent":"1990-01-01"},{"dtmSent":"2000-03-01"},{"dtmSent":"2020-01-01"}]}
    {"index":{"_index":"my-index-000001","_type":"_doc","_id":4}}
    {"dtmSent":[{"dtmSent":"1990-01-01"},{"dtmSent":"2002-03-01"},{"dtmSent":"2020-01-01"}]}
    

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2018-12-30
      • 2012-02-26
      • 2011-02-19
      相关资源
      最近更新 更多