[ElasticSearch 5.5.1]
我动态地构建了Elasticsearch查询(使用npm elasticsearch在js / node.js中),我发现这样做的部分麻烦是必须在赋值之前(显然)初始化深层嵌套的对象。为了简化编码,我创建了一个辅助函数,该函数自动初始化所有中间对象(如果不存在)。
function esqAssign(esq, keyPath, value) { }
let esq = {};
esqAssign(esq, 'bool.must.range.timestamp.gte', <timestamp>)
==>
esq = { bool: { must: { range { timestamp: { gte: <timestamp> }}}}}}
这很好用 除非 我有一个使用点扩展器语法的字段,例如:
esqAssign(esq, 'bool.filter.term.myfield.id', <id>)
=>
esq = { bool: { filter: { term: { myfield: { id: <id> }}}}}
在执行实际查询时失败。但是,这有效
esq = { bool: { filter: { term: { "myfield.id": <id> }}}}}
我的索引架构包含:
...
"myfield": {
"properties": {
"id": {
"type": "long"
},
}
}
为了使代码简单而不使函数签名esqAssign(esq, keyName, prop, value)
变小,我想避免使用点扩展符。
如果我从卷曲的角度来看这个,我想知道为什么它起作用:
curl localdev:9200/myindex/mytype/_search -XPOST -d '{ "query": { "bool": { "filter": { "term": { "myfield.id": 1234 } } } } }'
这不是:
curl localdev:9200/ myindex/mytype /_search -XPOST -d '{ "query": { "bool": { "filter": { "term": { "myfield": { "id": 1234 } } } } } }'
{
"error":{
"root_cause":[
{
"type":"parsing_exception",
"reason":"[term] query does not support [id]",
"line":1,
"col":69
}
],
"type":"parsing_exception",
"reason":"[term] query does not support [id]",
"line":1,
"col":69
},
"status":400
}
关于如何让ES接受{myfield:{id ...}而不是要求{myfield.id:...}的任何想法?