我使用的是 ES 版本 7.0。我有一个商店索引,其中有空闲时间(开放和关闭时间)在UTC时间。我在 Integer 中存储了时间,以便它可以轻松地与无痛脚本中的当前时间匹配。
下面是一个示例文档:
{
"availability" : {
"thu" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"tue" : [
{
"start" : 1300,
"end" : 2400
},
{
"start" : 0,
"end" : 400
}
],
"wed" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"sat" : [
{
"start" : 1400,
"end" : 2400
},
{
"start" : 0,
"end" : 500
}
],
"fri" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"mon" : [
{
"start" : 0,
"end" : 200
},
{
"start" : 1300,
"end" : 2400
}
],
"sun" : [
{
"start" : 1400,
"end" : 2400
},
{
"start" : 0,
"end" : 200
}
]
},
.
.
.
.
}
下面是使用无痛脚本的查询:
GET stores/_search
{
"query": {
"bool": {
"filter" : {
"script" : {
"script" : {
"source": "String d = params.day, start_key = 'availability.'+d+'.start', end_key = 'availability.'+d+'.end'; long t = params.time; if(doc[start_key].size() != 0 && doc[end_key].size() != 0){ long s = doc[start_key].value; long e = doc[end_key].value; return (s <= t && e > t); }",
"lang": "painless",
"params" : {
"day" : "wed",
"time" : 300
}
}
}
}
}
}
}
上述查询适用于星期三的时间300,结果中给出了上述文档,但不适用于星期四的时间1400。看起来脚本总是匹配可用性数组中的第一个值。
我还试图循环浏览可用性日,但这并没有给我找到任何字段错误。
GET stores/_search
{
"query": {
"bool": {
"filter" : {
"script" : {
"script" : {
"source": "String d = params.day, start_key = 'availability.'+d+'.start', end_key = 'availability.'+d+'.end'; long t = params.time; if(doc[start_key].size() != 0 && doc[start_key].size() != 0){ for(item in doc['availability.'+d]){ long s = item['start'].value; long e = item['end'].value; if (t >= s && t < e){ return true; } }}",
"lang": "painless",
"params" : {
"day" : "wed",
"time" : 300
}
}
}
}
}
}
}
上述查询返回以下错误
{ ....
"reason": {
"type": "script_exception",
"reason": "runtime error",
"script_stack": [
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:94)",
"org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:41)",
"for(item in doc['availability.'+d]){ long ",
" ^---- HERE"
],
"script": "String d = params.day, start_key = 'availability.'+d+'.start', end_key = 'availability.'+d+'.end'; long t = params.time; if(doc[start_key].size() != 0 && doc[start_key].size() != 0){ for(item in doc['availability.'+d]){ long s = item['start'].value; long e = item['end'].value; if (t >= s && t < e){ return true; } }}",
"lang": "painless",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "No field found for [availability.wed] in mapping with types []"
}
}
..... }
使用doc['可用性']['wed']
时也会出错
我错过了什么吗?
如果availability.wed是类型对象使用下面
{
"query": {
"script": {
"script": {
"source": "String d = params.day; for(int i=0; i<doc['availability.'+params.day+'.start'].length;i++){ long start =doc['availability.'+params.day+'.start'][i]; long end = doc['availability.'+params.day+'.end'][i]; if(start <= params.time && end > params.time){ return true;}} ",
"lang": "painless",
"params": {
"day": "wed",
"time": 2300
}
}
}
}
}
如果availability.wed是嵌套类型,请在下面使用
映射:
PUT testindex10/_mappings
{
"properties": {
"name":{
"type": "text"
},
"availability": {
"type": "object",
"properties": {
"mon": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
},
"tue": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
},
"wed": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
},
"thu": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
},
"fri": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
},
"sat": {
"type": "nested",
"properties": {
"start": {
"type": "integer"
}
}
}
}
}
}
}
数据:
[
{
"_index" : "testindex10",
"_type" : "_doc",
"_id" : "snyiPm0ButCCF6l_WyTl",
"_score" : 1.0,
"_source" : {
"name" : "store1",
"availability" : {
"mon" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"tue" : [
{
"start" : 1300,
"end" : 2400
},
{
"start" : 0,
"end" : 400
}
],
"wed" : [
{
"start" : 0,
"end" : 200
},
{
"start" : 1300,
"end" : 2400
}
],
"thu" : [
{
"start" : 1400,
"end" : 2400
},
{
"start" : 0,
"end" : 500
}
],
"fri" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
]
}
}
},
{
"_index" : "testindex10",
"_type" : "_doc",
"_id" : "s3yiPm0ButCCF6l_liQq",
"_score" : 1.0,
"_source" : {
"name" : "store2",
"availability" : {
"mon" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"tue" : [
{
"start" : 1300,
"end" : 2400
},
{
"start" : 0,
"end" : 400
}
],
"wed" : [
{
"start" : 0,
"end" : 500
},
{
"start" : 1300,
"end" : 2400
}
],
"thu" : [
{
"start" : 1400,
"end" : 2400
},
{
"start" : 0,
"end" : 500
}
],
"fri" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
]
}
}
}
]
询问
GET testindex10/_search
{
"query": {
"bool": {
"filter": {
"nested": {
"path": "availability.wed",
"query": {
"script": {
"script": {
"source": "String d = params.day; long start =doc['availability.'+params.day+'.start'].value; long end = doc['availability.'+params.day+'.end'].value; if(start <= params.time && end > params.time){ return true;} ",
"lang": "painless",
"params": {
"day": "wed",
"time": 400
}
}
}
}
}
}
}
}
}
结果:
[
{
"_index" : "testindex10",
"_type" : "_doc",
"_id" : "s3yiPm0ButCCF6l_liQq",
"_score" : 0.0,
"_source" : {
"name" : "store2",
"availability" : {
"mon" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
],
"tue" : [
{
"start" : 1300,
"end" : 2400
},
{
"start" : 0,
"end" : 400
}
],
"wed" : [
{
"start" : 0,
"end" : 500
},
{
"start" : 1300,
"end" : 2400
}
],
"thu" : [
{
"start" : 1400,
"end" : 2400
},
{
"start" : 0,
"end" : 500
}
],
"fri" : [
{
"start" : 0,
"end" : 400
},
{
"start" : 1300,
"end" : 2400
}
]
}
}
}
]
另一种不使用脚本(更好的性能)解决相同问题的方法是:
{
"query": {
"bool": {
"filter": {
"nested": {
"path": "availability.wed",
"query": {
"bool": {
"must": [
{
"range": {
"availability.wed.start": {
"lte": 400
}
}
},
{
"range": {
"availability.wed.end": {
"gte": 400
}
}
}
]
}
}
}
}
}
}
}
我是ES的新手,我正在尝试使用聚合编写搜索查询。 在写同样的东西时,我面临着无痛脚本的问题。 哪里可以得到完整的无痛脚本文档,用于弹性搜索?
我在elasticsearch中创建了一个观察器,当我们在索引中10分钟没有新条目或事件时,它会报告,这可以通过查看条目中的源字段来进一步划分。 我只得到了索引的最后10分钟,并查看了桶中不存在哪个源。 为此,我首先创建我们收到的所有源类型的列表,然后从返回的存储桶键创建一个列表。然后,我想比较列表以查看缺少哪个列表,然后将其传递到消息中。 我在for循环中遇到了一个通用错误。任何反馈对弹性和无痛
我没有Java经验,我对elasticsearch无痛脚本语言有问题。(这个名字叫“无痛”,选得不好)。 对于下面的代码,我得到了错误: 无法应用 [ 我用(float) doc['newPrice']将它绑定为float 然后我改为<code>“Double price=((Double)doc['discountPrice'] 并收到: “无法从[双]铸造到[双]。” 有人可以帮助我,尝试了很
我目前正在使用Elastic search 5.2,并尝试使用以下rest api执行upsert操作: > http://ip:9200/indexname/typename/id/_update Json有效载荷: } 此api执行以下操作: 1.)如果在弹性搜索中没有找到索引,则使用upsert字段中提供的json创建索引。< br> 2。)如果索引存在,那么它通过运行文档中提供的简单脚本来
我有一个弹性查询脚本,用于使用我给出的参数计算地面距离,我必须在多个查询中使用它。是否有一种方法可以避免这种重复,例如,有一种计算全局变量并在所有脚本中使用它的方法。在本例中,我希望计算<code>距离 映射:
我想将地理信息的旧数据重新索引到地理点。 以前的数据包含这种格式的位置。 我想像这样在数组中的地理点中重新索引位置 这是映射 这是我执行重新索引的请求。 问题它没有覆盖位置:{} 到位置:[]