У меня есть документ, который выглядит следующим образом:Elasticsearch - построение запросов - это правильный способ сделать это?
{
"foo": {
"orgnr": "1"
},
"bar": {
"orgnr" : "2"
},
"created": "2015-02-12",
...
}
У меня есть API, где пользователь может запросить для:
- orgnr (обязательно)
- роли (по желанию) - ЛЮБАЯ по умолчанию Любое средство должно соответствовать хотя бы одному из bar.orgnr или foo.orgnr, но также может быть роли: BAR, а затем оно должно соответствовать bar.orgnr:
- создано (необязательно)
- запрос (необязательно)
Orgnr должен соответствовать foo.orgnr ИЛИ bar.orgnr, а затем может иметь много других полевые и текстовые запросы. Я сопоставляю это с запросом строки запроса. Таким образом, для запроса, где orgnr равно 1, следующая строка запроса будет генерироваться:
(foo.orgnr: 1 ИЛИ bar.orgnr: 1) И (остальная часть запроса)
Где остальные запроса может быть, например,
- создан: [2015-01-01] к *
- создано: [2015-01-01 к *] И * запрос *
Но я не уверен, что это на самом деле правильный путь или это делается. Чтение https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html делает меня небезопасным. Я мог бы также использовать логическое совпадение с обязательным условием для orgnr.
С ролью: BAR следующий запрос будет генерироваться:
(bar.orgnr: 1) и (остальная часть запроса)
Наиболее важным здесь является то, что orgnr фактически соответствует в направлении foo OR bar orgnr.
Или я должен использовать фильтр для этого вместо этого?
Это прекрасный способ, но какая разница? Я имею в виду, что построение строки запроса с AND и OR для меня является намного более симпатичным. – J2B
Синтаксис запроса Lucene короче, чем синтаксис запроса запроса Elasticsearch Query, но для сложных запросов читаемость синтаксиса Lucene ниже. Если вы идете с синтаксисом Lucene и позволяете клиентам вводить поисковый запрос, тогда вам следует проявлять особую осторожность при дезинфекции ввода. – Henrik