数据结构如下:
{
"id":1,
"change_records" : [
{
"change_time" : 1646039270000
},
{
"change_time" : 1653728870000
},
{
"change_time" : 1658999270000
},
{
"change_time" : 1627463270000
}
]
}
请问如何用es查询 有N条chang_time在M年内的文档呢?
mapping:
{
"mappings": {
"_doc": {
"properties": {
"id": {
"type": "long"
},
"change_records": {
"properties": {
"change_time": {
"type": "long"
}
}
}
}
}
}
}
我尝试了用脚本查询, 但是一直提示字段不存在
GET /test_index/_search
{
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"source": """
int matches = 0;
def changeRecords = doc['change_records'];
for(def t : doc['change_records']){
if(t.change_time>= params.start && t.change_time <= params.end) {
matches ++;
}
}
return matches >= params.n ;
""",
"lang": "painless",
"params": {
"start": 0,
"end": 1658999270000,
"n": 1
}
}
}
}
]
}
}
}
No field found for [change_records] in mapping with types []
直接用exists是有这个字段的
{
"query":{
"bool": {
"filter": [
{
"exists": {
"field": "change_records"
}
}
]
}
}
}
测试数据:
POST /test_index/_doc
{
"id" : 51670,
"change_records":
[
{
"change_time":1646039270000
},
{
"change_time":1653728870000
},
{
"change_time":1658999270000
},
{
"change_time":1627463270000
}
]
}
不知道你用的什么开发语言,但是最终都是转换为
json
发起请求,我大概说一下吧,这个你通过自定义score来判断就行,然后呢,查询条件你校验一下score > 0
就行;body
部分查询结构大概如下:source
脚本部分类似于以下:另外,更详细的类似于这种情况的参见我的文章,里面对于类似的这种情况解释得很详细:
Elasticsearch 按照标签匹配个数优先排序查询