Редактировать
Я скопировал и вставил комментарий, который я написал в ответе:
... запрос работает так, как должен.Я писал этот вопрос в те времена, когда вы чувствуете себя загнанным в угол и не знаете, что еще попробовать.Ошибка не была ни в запросе, ни в Elasticsearch, это было потому, что я добавил новые поля в сообщение, а лямбда-функция не смогла проиндексировать новые сообщения (dynamic: false
).В довершение всего, у меня не было надлежащих сигналов тревоги CloudWatch в журналах Lambda.Я понял это после анализа журналов Kibana.Я предполагал, что сообщения были созданы, потому что они появились в разделе комментариев (главное хранилище - Динамо), но эти сообщения не были проиндексированы в Elasticsearch.
Исходный вопрос
У меня есть тысячи документов (сообщений), проиндексированных в Elasticsearch, и я пытаюсь сделать простой запрос:
SELECT *
FROM posts
WHERE comment LIKE '%comment%'
AND created_at >= '2019-04-03'
Я пробовал разные подходы, используя and
и bool
запросы:
bool
query
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"match": {
"comment": "comment"
}
},
{
"range": {
"created_at": {
"gte": "2019-04-03T00:00:00.000Z"
}
}
}
]
}
}
}
Результат :
Я получаю пустой набор результатов:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
and
query
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"filter": {
"and": {
"filters": [
{
"term": {
"comment": "comment"
}
},
{
"range": {
"updated_at": {
"gte": "2019-04-03T00:00:00.000Z"
}
}
}
]
}
}
}
}
}
Результат :
Исключение при разборе:
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 5,
"col": 21
}
],
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 5,
"col": 21
},
"status": 400
}
Анализатор
Я использую следующееПользовательский анализатор:
{
analysis: {
analyzer: {
custom_analyzer: {
tokenizer: 'custom_tokenizer',
filter: 'lowercase'
}
},
tokenizer: {
custom_tokenizer: {
type: 'ngram',
min_gram: 2,
max_gram: 16,
token_chars: [
'letter',
'digit',
'punctuation',
'symbol'
]
}
},
}
}
Ожидаемый результат
Когда я запускаю отдельные запросы, один для match
в comment
и другой для range
в created_at
, я получаю то, что должен возвращать:
Поиск по тексту в comment
:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"match": {
"comment": "comment"
}
}
]
}
}
}
Результат :
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 888,
"max_score": 1.9128458,
"hits": [...]
}
}
Поиск по дате range
в created_at
:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"range": {
"created_at": {
"gte": "2019-04-03T00:00:00.000Z"
}
}
}
]
}
}
}
Результат :
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 19,
"max_score": 1,
"hits: [...]
}
}
Я вполне уверен, что сообщения, созданные после March 3rd
с comment
текстом вcomment
поле Я добавил тестовые данные с комментариями, содержащими эту подстроку.