如何让ElasticSearch遵守查询的非点扩展器表示法?

时间:2018-12-11 18:33:23

标签: node.js elasticsearch elasticsearch-5

[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:...}的任何想法?

0 个答案:

没有答案