Возможно, вы попадаете в пределы вашего оборудования, но сначала вы можете сделать свой запрос, чтобы помочь его оптимизировать.
Макс Expansions
Первое, что я хотел бы сделать это предел max_expansions
. Как работает префикс-запрос, создается список префиксов, соответствующих последнему токену в вашем запросе. В вашем поисковом запросе «какой-то поисковый запрос» последний токен «термин» будет расширен с использованием «term» в качестве префиксного семени. Вы можете создать список, как это:
- термин
- термины
- прекратить
- терминатор
- термитов
Процесс расширения префикса проходит через ваш список проводок ищет любое слово который соответствует префиксу семени. По умолчанию этот список неограничен, что означает, что вы можете создать очень большой список расширений.
Вторая фаза перезаписывает ваш исходный запрос в серии term
запросов с использованием расширений. Чем больше список расширений, тем больше условий оценивается против вашего индекса и соответствующего снижения скорости.
Если ограничить процесс расширения, чтобы что-то разумное, вы можете поддерживать скорость и до сих пор, как правило, получить хорошее соответствие префиксов:
{
"query" : {
"multi_match" : {
"query" : "some search term",
"fields" : [ "title", "content" ],
"type": "phrase_prefix",
"max_expansions" : 100
}
},
"size": 20,
"fields" :["article_id", "feed_id"],
}
Вы должны играть с сколько расширений вы хотите. Это компромисс между скоростью и отзывом.
Фильтрация
В общем, другая вещь, которую вы можете добавить это фильтрация. Если есть какой-то критерий, на который вы можете фильтровать, вы можете резко увеличить скорость. В настоящее время ваш запрос выполняется против всего индекса (250 млн. Документов), который много для оценки. Если вы можете добавить фильтр, который сокращает это число, вы можете увидеть значительно улучшенную задержку.
В конце дня, чем меньше документов будет оцениваться запрос, тем быстрее будет выполняться запрос.Фильтры уменьшают количество документов, которые будут видеть запросы, кэшируются, работают очень быстро и т. Д.
В вашей ситуации могут не быть применимых фильтров, но если это так, они могут действительно помочь!
файловой системы Кэширование
Этот совет полностью зависит от остальной части системы. Если вы не полностью используете свою кучу (24gb), потому что вы выполняете простой поиск и фильтрацию (например, не факел/гео/тяжелые сорта/сценарии), вы можете перераспределить свою кучу в кеш файловой системы.
Например, если максимальное использование кучи достигает 12 ГБ, может иметь смысл уменьшить размер кучи до 15 гб. Дополнительные 10gb, которые вы освободили, вернутся в ОС и помогут сегменты кеша, что поможет повысить производительность поиска просто из-за того, что больше операций бездисковых.
Спасибо за ваш ответ, я буду играть с опцией max_expansion. У меня на самом деле есть фильтр условий в feed_id в запросе, но я думал, что фильтр применяется к результирующему набору, после того как поиск сделан, я думаю, что я ошибся с этим предположением ... – flext
Пока вы используете 'фильтрованный 'запрос для фильтрации, фильтр будет применяться (более или менее) до самого запроса. Точный порядок зависит от оптимизатора запросов внутри ES, но вы можете смело думать об этом как «раньше». Однако, если вы используете фильтр верхнего уровня, он применяется после запроса, и вы не получите хорошую производительность. – Zach
Хорошая точка, я использую фильтр верхнего уровня. Я также нашел ваше объяснение об отфильтрованном запросе и запросе с помощью верхнего рычажного фильтра в поисковых группах. Сейчас имеет большой смысл. Еще раз спасибо! – flext