我有Shop
每个都有关系的模型,Timetable
其中可能包含类似的内容:
shop_id: 1, day: 5, open_hour: 7, open_minutes: 0, close_hour: 13, close_minute: 30
shop_id: 1, day: 5, open_hour: 14, open_minutes: 30, close_hour: 18, close_minute: 00
当然Timetable
可以有更优雅的格式,但是接下来的问题是:如何通过elasticsearch(tire)查找开着的Shop?
所有的想法都会被感动!谢谢!
找到的解决方案:
为每天(星期日,星期一,..)创建单独的索引
每天从Timetable
以下位置构建完整的分钟列表:
((open_hour * 60 + open_minute)..(close_hour * 60 + close_minute)).to_a
添加过滤器进行搜索:
filter :term, current_day_name => (current_hour * 60 + current_minutes)
这个解决方案也可以,但是看起来很麻烦,因为如果Shop
每天工作8个小时,我创建的数组的大小为:(将8 * 60 = 480
其转换为索引字段的字符串),所以这就是为什么这个问题仍然存在,也许有人会找到更好的解决方案
@Andrei Stefan的轮胎零件答案:
indexes :open_hours, type: :nested do
indexes :open, type: 'integer'
indexes :close, type: 'integer'
end
open_hours_query = Tire::Search::Query.new do
filtered do
query { all }
filter :range, "open_hours.open" => { lte: current_time }
filter :range, "open_hours.close" => { gte: current_time }
end
end
filter :nested, { path: 'open_hours', query: open_hours_query.to_hash }
我会考虑这样做如下:
例如:商店在第1天的07:00开店,在13:30关门,然后在14:30开店,在18:00关门,将在ES中转换为:
"shop_name": "Shop 1",
"open_hours": [
{ "open": 420, "close": 810 },
{ "open": 870, "close": 1080 }
]
一周中的每一天(1-> 7)代表一个值(将添加到分钟数中):
Day 1 = addition 0
Day 2 = addition 2000
Day 3 = addition 4000
…
Day 7 = addition 10000
因此,每天增加2000,因为每天最多包含1440分钟(24小时* 60分钟),并且为了能够将一天与单个数字区分开,这些数字不必相交。
因此,上面示例中商店在07:00开张的示例将在第4天转换为:
"shop_name": "Shop 1",
"open_hours": [
{ "open": 6420, "close": 6810 },
{ "open": 6870, "close": 7080 }
]
查询这些文档时,您要搜索的那一天需要遵循与上述相同的规则。例如,如果要查看是否在第4天的13:45打开了“商店1”,则可以搜索(6000 + 13 * 60 + 45 = 6825)分钟。
Elasticsearch中上述所有内容的映射如下:
{
"mappings": {
"shop" : {
"properties": {
"shop_name" : { "type" : "string" },
"open_hours" : {
"type" : "nested",
"properties": {
"open" : { "type" : "integer" },
"close": { "type" : "integer" }
}
}
}
}
}
}
POST /shops/shop/_bulk
{"index":{}}
{"shop_name":"Shop 1","open_hours":[{"open":420,"close":810},{"open":870,"close":1080}]}
{"index":{}}
{"shop_name":"Shop 2","open_hours":[{"open":0,"close":500},{"open":1000,"close":1440}]}
{"index":{}}
{"shop_name":"Shop 3","open_hours":[{"open":0,"close":10},{"open":70,"close":450},{"open":900,"close":1050}]}
{"index":{}}
{"shop_name":"Shop 4","open_hours":[{"open":2000,"close":2480}]}
{"index":{}}
{"shop_name":"Shop 5","open_hours":[{"open":2220,"close":2480},{"open":2580,"close":3000},{"open":3100,"close":3440}]}
{"index":{}}
{"shop_name":"Shop 6","open_hours":[{"open":6000,"close":6010},{"open":6700,"close":6900}]}
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "open_hours",
"query": {
"bool": {
"must": [
{
"filtered": {
"filter": {
"range": {
"open_hours.open": {
"lte": 2400
}}}}},
{
"filtered": {
"filter": {
"range": {
"open_hours.close": {
"gte": 2400
}}}}}
]
}}}}
]
}}}
将输出Shop 4和Shop 5:
"shop_name": "Shop 4",
"open_hours": [
{
"open": 2000,
"close": 2480
}
]
"shop_name": "Shop 5",
"open_hours": [
{
"open": 2220,
"close": 2480
},
{
"open": 2580,
"close": 3000
},
{
"open": 3100,
"close": 3440
}
]
稍后编辑: 自从我添加此回复以来,Elasticsearch有了很长的路要走,此后发生了很多变化,因此可以用a
或什至简单的替换filtered
过滤器(在bool
must
我使用的上下文中)。另外,6.x中不再存在,因此,如果您需要以某种方式使用分析器或()按商店名称进行搜索,则可以使用:bool
filter
must``string``text``keyword``"shop_name": { "type" : "text" },
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "open_hours",
"query": {
"bool": {
"filter": [
{
"range": {
"open_hours.open": {
"lte": 2400
}
}
},
{
"range": {
"open_hours.close": {
"gte": 2400
}
}
}
]
}
}
}
}
]
}
}
}
问题内容: 是否可以使用Tire更新elasticsearch设置?我有这个curl命令,我想自动运行。 该值可通过轮胎获得,但我不确定如何应用。 问题答案: 可能,但是很丑:) 在将来的版本中会变得更好…
问题内容: 当我尝试将我的数据框分组到一个列上,然后尝试查找每个分组的最小值时,似乎无法在非数字列上执行此操作。然后,如何正确过滤分组依据上的最短(最早)日期? 我正在从Postgresql S3实例流式传输数据帧,因此已经配置了数据。 问题答案: 只需直接执行聚合,而不使用辅助程序即可: 与之不同的是,它将适用于任何类型。
问题内容: 我想通过查找数据。我知道该数据存在并且存在(我已经用pymongo测试了它)。 但是下面的代码找不到它: 它只是给我一个回报。 但是我可以使用pytmongo和python找到它。 结果如下: 有人有什么主意吗? 编辑:我已经尝试了: 但我仍然有0: 问题答案: 您可以使用然后仅传递id值,或者使用,然后还必须使用字段名称指定一个值: 如果没有错误,则表示找到了文档。 如果您始终看到已
问题内容: 以下定位技术之间有什么区别? 而且,从 性能角度来看 ,哪种方法是通过id定位元素的最快方法? 问题答案: 您的问题很难回答,肯定会给出一个结论性的答案。实际上,我很想将此问题标记为“太宽泛”,其他答案和评论也支持该问题。 以您的为例。纵观Selenium来源, 大多数 驱动程序只是获取您提供的ID,然后将其传递给有线协议: 如您所知,每个浏览器供应商都在单独的二进制文件中实现自己的有
请帮助我,我正在尝试选择一个图片,这是一个链接(一个网站上的培训师) 这是我的代码:
问题内容: 我有一些使用Tyre gem在Elasticsearch中建立索引的PDF附件。一切都很好,但是我将拥有许多GB的PDF,我们可能会将PDF存储在S3中以进行访问。现在,base64编码的PDF存储在Elasticsearch _source中,这将使索引很大。我想对附件建立索引,但不进行存储,并且我还没有弄清楚正确的方法可以放入Tire的“映射”块中以防止它出现。现在的代码块是这样的