оптипизаиця пойска в данном индексе.

42 views
Skip to first unread message

Grigory Rubshtein

unread,
Mar 11, 2015, 3:22:30 AM3/11/15
to elastics...@googlegroups.com, גרגורי רובשטיין
Добрый день

Хотел бы попросить совета по поводу нашего дейвствуещего индекса который построен по принципу Parent Child,
сейчас пойск слово занимает очень много временеи около 3 минут.
Ниже привидена структура индекса.



наша база(ниже приведена структра индекса) содержит информацию о покупках и обзорах в разных  магазинов.
Parent содержит мета дату о покупке а дети содержат Коментарии(comments) к покупки и имена товаров(products).
важно отметить что поиск всегда будет проводится только для одного магазина(для конкретного store_id).

на данный момент запрос найти Parent Чьи дети содержат слово занимает до нескольких минут .....

Информация по кластеру и индексу :
Количество документов 2,7 миллиарда , размер 360 гига
9 шардов , одна реплика (всего 18)
6 машин 


очень буду благодарен любому совету.





{
  "Purchase": {
    "mappings": {
      "_default_": {
        "dynamic": "false",
        "_all": {
          "enabled": false
        },
        "_ttl": {
          "enabled": true,
          "default": 34560000000
        },
        "_source": {
          "enabled": false
        },
        "properties": {
          
        }
      },

      "Parent": {
        "dynamic": "false",
        "_all": {
          "enabled": false
        },
        "_ttl": {
          "enabled": true,
          "default": 34560000000
        },
        "properties": {
          "store_id": {
            "type": "string",
            "index": "not_analyzed",
            "store": true
          },
          "endTime": {
            "type": "long",
            "store": true
          },
          "startTime": {
            "type": "long",
            "store": true
          },
          "purchaseId": {
            "type": "string",
            "index": "not_analyzed",
            "store": true
          }
        }
      },
      "comments": {
        "dynamic": "false",
        "_all": {
          "enabled": false
        },
        "_parent": {
          "type": "Parent"
        },
        "_routing": {
          "required": true
        },
        "_ttl": {
          "enabled": true,
          "default": 34560000000
        },
        "_source": {
          "enabled": false
        },
        "properties": {
          "text": {
            "type": "string"
          }
        }
      },
"products": {
        "dynamic": "false",
        "_all": {
          "enabled": false
        },
        "_parent": {
          "type": "Parent"
        },
        "_routing": {
          "required": true
        },
        "_ttl": {
          "enabled": true,
          "default": 34560000000
        },
        "_source": {
          "enabled": false
        },
        "properties": {
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}

Igor Motov

unread,
Mar 11, 2015, 7:38:16 PM3/11/15
to elastics...@googlegroups.com, fut...@gmail.com
Вы не могли бы во время запроса запустить hot threads (http://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-hot-threads.html) несколько раз и прислать сюда результаты.

Grigory Rubshtein

unread,
Mar 12, 2015, 1:21:30 AM3/12/15
to elastics...@googlegroups.com, fut...@gmail.com, vla...@liveperson.com
Очень признателен за помощь
 я запустил в течение запроса 6 раз hot_threds, каждый прилагается в файле.
hot_threads3.txt
hot_threads4.txt
hot_threads5.txt
hot_threads6.txt
hot_threads1.txt
hot_threads2.txt

Igor Motov

unread,
Mar 12, 2015, 1:40:33 AM3/12/15
to elastics...@googlegroups.com, fut...@gmail.com, vla...@liveperson.com
Судя по hot_threads, эти 3 минуты уходят на загрузку кэша родительских отношений. После того, как кэш будет загружен все должно работать гораздо быстрее. Вы пробовали запускать этот запрос несколько раз? У вас кэш как-нибудь ограничен?

Еще я заметил, что вы используете TTL. Использование ttl на индексе такого размера - не очень хорошее решение. 

Grigory Rubshtein

unread,
Mar 12, 2015, 1:52:09 AM3/12/15
to elastics...@googlegroups.com, fut...@gmail.com, vla...@liveperson.com
Действительно если я запускаю именно этот запрос несколько раз подряд время снижается с 3 минут то 10-15 секунд(что тоже очень много для нас), но так как мы используем несколько разновидностей запроса, скажем если мы запустил тот же  запрос через час, время обработки опять вырастает до нескольких минут.

1) как вы бы посоветовали оптимизировать структуру индекса/ сам запрос (вложил в фаиле)
2) по поводу TTL, как он может влиять на время запроса ?
query.txt

Igor Motov

unread,
Mar 19, 2015, 11:01:54 AM3/19/15
to elastics...@googlegroups.com, fut...@gmail.com, vla...@liveperson.com
1) post_filter - это специальный фильтр, который работает после того, как запрос выполнился. В вашем случае, этот фильтр может существенно замедлить поиск. Я бы посоветовал переключится на constant_score с фильтром bool. То есть структура должна быть такой:

{
    "from": 0,
    "size": 50,
    "query": {
        "constant_score": {
            "filter": {
                "bool": {
                 ....
                }
            }
        }
    }
}

2) Вы постоянно удаляете самые старые записи, которые (в связи с тем, что они старые) скорее всего находятся в самых больших сегментах. То есть в самых больших сегментах постоянно создаются дырки, что в свою очередь требует постоянного сливания этих сегментов со всеми вытекающими последствиями.
Reply all
Reply to author
Forward
0 new messages