gpt4 book ai didi

ruby-on-rails - 用于匹配单个日期的 ElasticSearch 过滤器

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:12 24 4
gpt4 key购买 nike

我使用 Elasticsearch 已经有一段时间了,但遇到了障碍,我必须搜索与特定开始日期 (start_at) 匹配的事件。我已将我的字段编入索引


mapping do
indexes :name, :type => 'string', :analyzer => 'snowball'
indexes :description, :type => 'string', :analyzer => 'snowball'
indexes :start_at, :type => 'date'
indexes :end_at, :type => 'date'
indexes :tag_list, :type => 'string', :analyzer => 'snowball'
indexes :lat_lon, :type => 'geo_point'
indexes :user_details, :type => 'string'
end



def to_indexed_json
to_hash.merge({
:user_details => (user ? user.to_index : nil),
:artist_details => (artists ? artists.each{|artist| artist.to_index }: nil),
:primary_genre => (genre ? genre.name : nil),
:lat_lon => [lat, lng].join(',')
}).to_json
end

所以当我打


Tire.search('events') do
# ignore search query keywords
filter range: {start_at: {gte: Date.today, lt: Date.tomorrow}}
end

什么都不返回,但对单个范围非常有效。也就是


Tire.search('events') do
# ignore search query keywords
filter range: {start_at: {gte: Date.today}}
end

我为 Elasticsearch 建立了事件映射索引,将 start_at 和 end_at 转换为日期,或者它会在这些日期上执行术语匹配,但像这样的事情不是答案


Tire.search('events') do
query do
string "start_at: #{Date.today}"
end
end

由于这执行的是字符串匹配,因此它会生成所有记录,因为分词器会分成 2012、05、16,并且由于 2012 和 16 可能在多个区域匹配,因此它会返回所有匹配项。

我知道我遗漏了一些非常基本的东西。我将不胜感激。

更新



Event.find_all_by_start_at(Date.tomorrow + 1.day).size
Event Load (0.7ms) SELECT `events`.* FROM `events` WHERE `events`.`start_at` = '2012-05-19'
=> 1

所以那天我有事件。现在,当我使用 Elasticsearch 运行它时


ruby-1.9.2-p180 :024 > Tire.search('events') do
ruby-1.9.2-p180 :025 > filter :range, :start_at => {gte: Date.tomorrow + 1.days, lt: Date.tomorrow + 2.days}
ruby-1.9.2-p180 :026?> end

ruby-1.9.2-p180 :029 > x.to_curl
=> "curl -X GET \"http://localhost:9200/events/_search?pretty=true\" -d '{\"filter\":{\"range\":{\"start_at\":{\"gte\":\"2012-05-19\",\"lt\":\"2012-05-20\"}}}}'"



{"events":{"event":{"properties":{"allow_comments":{"type":"boolean"},"artist_details":{"type":"string"},"artist_id":{"type":"long"},"city":{"type":"string"},"comments_count":{"type":"long"},"confirm":{"type":"boolean"},"created_at":{"type":"date","format":"dateOptionalTime"},"description":{"type":"string","analyzer":"snowball"},"end_at":{"type":"string"},"event_attendees_count":{"type":"long"},"event_content_type":{"type":"string"},"event_file_name":{"type":"string"},"event_file_size":{"type":"long"},"genre_id":{"type":"long"},"hits":{"type":"long"},"id":{"type":"long"},"interview":{"type":"boolean"},"lat":{"type":"double"},"lat_lon":{"type":"geo_point"},"lng":{"type":"double"},"location":{"type":"string"},"name":{"type":"string","analyzer":"snowball"},"online_tix":{"type":"boolean"},"primary_genre":{"type":"string"},"private":{"type":"boolean"},"start_at":{"type":"string"},"state":{"type":"string"},"tag_list":{"type":"string","analyzer":"snowball"},"updated_at":{"type":"date","format":"dateOptionalTime"},"user_details":{"type":"string"},"user_id":{"type":"long"},"venue_id":{"type":"long"},"zip":{"type":"string"}}}}}

最佳答案

Elasticsearch 试图灵活地处理映射。同时,还要应对底层搜索引擎——Lucene的局限性。因此,当现有映射与更新的映射相矛盾时,新映射将被忽略。 elasticsearch 的另一个可能在这个问题中发挥作用的特性是基于数据的自动映射创建。所以,如果你

  1. 创建新索引
  2. 使用包含日期的字符串对字段 start_at 的记录进行索引,该格式的日期格式 elasticsearch 无法识别
  3. 更新了将类型“date”分配给 start_at 字段的映射

您最终得到了字段 start_at 的类型为“string”的映射。解决它的唯一方法是在添加第一条记录之前删除索引并指定映射。

关于ruby-on-rails - 用于匹配单个日期的 ElasticSearch 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10620114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com