[ElasticSearch 5.5.1]
Я динамически создаю запросы эластичного поиска (в js / node.js, используя npmasticsearch), и я обнаружил, что часть этой проблемы заключается в том, что мне нужно инициализироватьглубоко вложенные объекты перед присваиванием (очевидно).Чтобы упростить кодирование этого, я создал вспомогательную функцию, которая автоматически инициализирует все промежуточные объекты, если они не существуют.
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: ...}?