Как заставить ElasticSearch соблюдать нотацию без точек для запросов? - PullRequest
0 голосов
/ 11 декабря 2018

[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: ...}?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...