Я индексирую имена метрик в эластичном поиске. Имена метрик имеют форму foo.bar.baz.aux
. Вот индекс, который я использую.
{
"index": {
"analysis": {
"analyzer": {
"prefix-test-analyzer": {
"filter": "dotted",
"tokenizer": "prefix-test-tokenizer",
"type": "custom"
}
},
"filter": {
"dotted": {
"patterns": [
"([^.]+)"
],
"type": "pattern_capture"
}
},
"tokenizer": {
"prefix-test-tokenizer": {
"delimiter": ".",
"type": "path_hierarchy"
}
}
}
}
}
{
"metrics": {
"_routing": {
"required": true
},
"properties": {
"tenantId": {
"type": "string",
"index": "not_analyzed"
},
"unit": {
"type": "string",
"index": "not_analyzed"
},
"metric_name": {
"index_analyzer": "prefix-test-analyzer",
"search_analyzer": "keyword",
"type": "string"
}
}
}
}
Приведенный выше индекс создает следующие термины для имени метрики foo.bar.baz
foo
bar
baz
foo.bar
foo.bar.baz
Если у меня есть куча метрик, как показано ниже
a.b.c.d.e
a.b.c.d
a.b.m.n
x.y.z
Мне нужно написать запрос, чтобы получить токены n-го уровня. В приведенном выше примере
for level = 0, I should get [a, x]
for level = 1, with 'a' as first token I should get [b]
with 'x' as first token I should get [y]
for level = 2, with 'a.b' as first token I should get [c, m]
Я не мог придумать никакого другого способа, кроме как написать агрегацию терминов. Чтобы выяснить токены уровня 2 a.b
, вот запрос, который я придумал.
time curl -XGET http://localhost:9200/metrics_alias/metrics/_search\?pretty\&routing\=12345 -d '{
"size": 0,
"query": {
"term": {
"tenantId": "12345"
}
},
"aggs": {
"metric_name_tokens": {
"terms": {
"field" : "metric_name",
"include": "a[.]b[.][^.]*",
"execution_hint": "map",
"size": 0
}
}
}
}'
Это приведет к следующим ведрам. Я анализирую вывод и беру оттуда [c, m].
"buckets" : [ {
"key" : "a.b.c",
"doc_count" : 2
}, {
"key" : "a.b.m",
"doc_count" : 1
} ]
Все идет нормально. Запрос отлично работает для большинства арендаторов (обратите внимание на запрос tenantId
term
выше). Для некоторых арендаторов с большими объемами данных (около 1 миллиона) производительность очень низкая. Я предполагаю, что агрегация всех терминов требует времени.
Мне интересно, является ли агрегация терминов правильным выбором для такого рода данных, а также поиск других возможных типов запросов.
metrics_alias
сколько индексов он затрагивает? Насколько они велики? Когда вы запускаете тяжелый запрос (с миллионами метрик), как используется ЦП и куча для узлов? - person Andrei Stefan   schedule 18.07.2016query
. Таким образом, для сопоставленияa.b.
используйте это как запрос: ` запрос: { bool: { must: [ {term: {tenantId: 123 } }, { prefix: { metric_name: { value: a.b. } } } ] } }` и сохраните тот же разделaggs
. Проверьте это и дайте мне знать, как это происходит. Запустите его несколько раз, а не один раз. - person Andrei Stefan   schedule 19.07.2016"size": 0
для части агрегации. Вам действительно нужна агрегация, чтобы вернуть все ведра, независимо от того, сколько их. Можете ли вы проверить запрос, например, с помощью"size": 100
? - person Andrei Stefan   schedule 19.07.2016"execution_hint": "map"
и дайте Elasticsearch использовать значения по умолчанию. - person Andrei Stefan   schedule 19.07.2016The query which runs in 11 secs now took around 50 secs if I remove "execution_hint": "map"
... хм... а вы, если у вас все ещеexecution_hint
не включено, и вы запускаете запрос несколько раз (скажем, 10 раз), он все равно возвращается через 50 секунд? - person Andrei Stefan   schedule 19.07.2016hot_threads
из кластера:curl -XGET "http://localhost:9200/_nodes/hot_threads?threads=5000"
. Итак, во время выполнения запроса (11 секунд) запустите предыдущуюhot_threads
команду дважды с интервалом 2-3 секунды и сохраните каждый запуск в отдельном текстовом файле. Используйтеgist
, чтобы поделиться ими. - person Andrei Stefan   schedule 19.07.2016prefix
, а неregexp
. Я чувствую, чтоprefix
быстрее, а также делает то же самое (с точки зрения фильтрации), что и регулярное выражение. Пожалуйста, попробуйте использовать в качестве фильтраprefix
, а неregexp
. - person Andrei Stefan   schedule 19.07.2016prefix
в части фильтра и посмотрите, что получится. И, как вы понимаете, регулярное выражение в агрегации только потому, что я не вижу другого способа фильтровать термины. - person Andrei Stefan   schedule 19.07.2016a.b
вfield2
,a.b.c
вfield3
и так далее. Это для того же документа. Затем во время поиска вы просматриваете определенные поля в зависимости от искомого текста. Однако вся эта идея требует дополнительной работы вне ES. - person Andrei Stefan   schedule 19.07.2016