ElasticSearch查询日期功能脚本

时间:2016-02-11 17:27:42

标签: ruby-on-rails elasticsearch scripting

一点背景......我正在转换现有的API以利用弹性搜索来提高性能。

这是一款使用有效记录的rails应用。以下是我们在弹性搜索中尝试执行的条件的查询:

where("start_date BETWEEN :start_at AND :end_at
       OR end_date BETWEEN :start_at AND :end_at
       OR :start_at BETWEEN start_date AND end_date
       OR :end_at BETWEEN start_date and end_date", start_at: start_at.to_date, end_at: end_at.to_date)

where子句的前半部分很容易复制。以下是该部分的外观:

Model.search(
  query:  {
    bool: {
      should: [
        {
          range: {
            start_date: {
              gte: '2015-12-01',
              lte: '2015-12-25'
            }
          }
        },
        {
          range: {
            end_date: {
              gte: '2015-12-01',
              lte: '2015-12-25'
            }
          }
        }
      ],
      minimum_should_match: 1
    }
  }
)

我只是不确定如何实现where子句的第二部分。我曾尝试使用脚本编写,但我在将日期转换为适当格式时遇到问题,以便对其进行比较。

例如,这是我尝试的东西:

filter: {
  script: {
    script: {
      inline: "doc['start_date'] > start_on",
      params: {
        start_on: Date.parse('2015-12-01')
      }
    }
  }
}    

当我这样做时,我收到此错误:

无法比较org.elasticsearch.index.fielddata.ScriptDocValues $ Longs with value' [1449446400000]'和值为' 2015-12-01'"

的java.lang.String

我也试过这个:

script: "Date.parse('yyyy-MM-dd', '2015-12-01').getTime() >= doc['start_date']"

我收到此错误:

org.elasticsearch.index.fielddata.ScriptDocValues $ Longs无法转换为java.lang.Long

我只是不确定如何使数据类型匹配,以便我可以比较日期。

我希望我可以做这样的事情,但当然不可能:

range: {
  '2015-12-01': {
    gte: start_date
  }
}

对此的任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个:

filter: {
  script: {
   script: {
     inline: "new java.util.Date(doc['start_date'].value) > new java.util.Date(2015-12-01)"

    }
  }
} 

答案 1 :(得分:0)

一位同事给我发了这个:https://stackoverflow.com/a/325964,所以我最终得到了一个更简单的方法:

Model.search(
  query:  {
    bool: {
      must: [
        {
          range: {
            start_date: {
              lte: '2015-12-25'
            }
          }
        },
        {
          range: {
            end_date: {
              gte: '2015-12-01',
            }
          }
        }
      ]
    }
  }
)