Я использую этот вид сопоставления (ну, это краткая версия, чтобы упростить вопрос) по отношению child-parent, где item
- это parent
и user_items
- children
.Elasticsearch 1-й запрос медленный, даже если я использую «loading: eager»
curl -XPUT 'localhost:9200/myindex?pretty=true' -d '{
"mappings": {
"items": {
"dynamic": "strict",
"properties" : {
"title" : { "type": "string" },
"body" : { "type": "string" },
}},
"user_items": {
"dynamic": "strict",
"_parent": {"type": "items" },
"properties" : {
"user_id" : { "type": "integer" },
"source_id" : { "type": "integer" },
}}}}'
И тип запроса я обычно делаю:
curl -XGET 'localhost:9200/myindex/items/_search?pretty=true' -d '{
"query": {
"bool": {
"must": [
{
"query_string": {
"fields": ["title", "body"],
"query": "mercado"
}
},
{
"has_child": {
"type": "user_items",
"query": {
"term": {
"user_id": 655
}}}}]}}}'
В этом запросе он должен искать на полях title
и body
Строка mercado
на данный user_id
, в этом случае 655
.
Первый из этих запросов является медленным, это может занять до 15 секунд. Следующие довольно быстрые (< 0,5 сек)
Я читал, что причиной столь медленного первого запроса является то, что он кэшируется, а затем остальные запросы выполняются быстро, потому что он работает с кэшированным контентом.
Я читаю, что могу использовать "loading" : "eager"
для увеличения первого запроса. Таким образом, я создал новое отображение на новый индекс с именем myindex_new
{
"mappings": {
"items": {
"dynamic": "strict",
"properties" : {
"title" : { "type": "string" ,
"fielddata": {
"loading" : "eager"}},
"body" : { "type": "string",
"fielddata": {
"loading" : "eager"}},
}},
"user_items": {
"dynamic": "strict",
"_parent": {"type": "items" },
"properties" : {
"user_id" : { "type": "integer" },
"source_id" : { "type": "integer" },
}}}}'
... и переиндексирован все следующим образом:
curl -XPOST 'localhost:9200/_reindex' -d '{
"source" : {
"index" : "myindex"
},
"dest" : {
"index" : "myindex_new"
}
}'
Дело в том, что я не получаю никаких лучших результатов. Первый запрос все еще медленный, если я запрошу новый индекс с помощью eager
. Я также попытался добавить eager
в дочерние поля, но он все еще медленный.
Должен ли я сделать что-то другое? Я делаю что-то неправильно в переиндексации или что-то в этом роде?
Заранее благодарен!
Какая версия ES? –
Elasticsearch 2.3 –
Fielddata используется для сортировки и агрегации по этим конкретным полям. Это не поможет с вашим конкретным запросом, потому что вы не используете эти поля для сортировки или внутри агрегации. Я бы попробовал другой тип загружаемой загрузки, а на дочернем - не поля родителя: '" loading ":" eager_global_ordinals "'. Более полный пример [здесь] (https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child-performance.html#_global_ordinals_and_latency).Кроме того, не забывайте, что кеш фильтра также играет роль :-). –