【问题标题】:How to search date ranges using ElasticSearch and Searchkick?如何使用 ElasticSearch 和 Searchkick 搜索日期范围?
【发布时间】:2016-12-12 02:07:17
【问题描述】:

我将Rails 4.1.4searchkick (1.3.0) 一起使用,因此我可以使用弹性搜索。

我有User 模型

class User
  searchkick
  def search_data
    {
     name: username,
     email: email,
     created_at: created_at.strftime("%d-%m-%Y")
    }
  end
end

created_at dd-MM-yyyy 格式。如何搜索日期范围,假设日期从 01-01-201401-01-2015

我厌倦了User.search('*', where: {created_at: {gte:'01-01-2014', lte: '01-01-2015' } }) 之类的东西而没有得到正确的结果。

有什么帮助吗?

【问题讨论】:

    标签: ruby elasticsearch searchkick


    【解决方案1】:
    class User
      searchkick
      def search_data
        {
         name: username,
         email: email,
         created_at: created_at.to_time
        }
      end
    end
    

    代替

    created_at: created_at.strftime("%d-%m-%Y")

    试试

    created_at: created_at.to_time

    【讨论】:

      【解决方案2】:

      我不熟悉 Searchkick,但是如果你使用elasticsearch gem,你可以很容易地向 ElasticSearch 发出搜索请求

      query = {
        query: {
          bool: {
            must: [
              {
                 term: {
                   username: "Kevin" 
                 }
              },
              {
                 term: {
                   email: "email@gmail.com"
                 } 
              },
              {
                 range: {
                   created_at: {
                     lte: "2016-06-06",
                     gte: "2016-06-06",
                     format: "yyyy-MM-dd"
                   }
                 }
              }
            ]
          }
        }
      }
      

      搜索请求将如下所示:

      client = Elasticsearch::Client.new
      client.search( 
        index: index_name,
        body: {
          query: query
        }
      )
      

      希望这会有所帮助!

      【讨论】:

      • 感谢您的帮助。所以对于范围我不必指定字段created_at?
      • 如果我将术语与 searchkick 一起使用,我会收到以下错误:“Unknown where operator: :range”
      • 我刚刚更新了我的查询,抱歉我错过了created_at 字段,你是对的。关于Searchkick,我建议你查看查询类github.com/ankane/searchkick/blob/master/lib/searchkick/…的src。我觉得这让我有点困惑哈哈。
      【解决方案3】:

      形成一个正确的 DateTime 对象,您的代码应该可以工作 只需使用

      .to_datetime
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多