День добрый.
Исторически сложилось, что есть 18 одинаковых индексов. В каждом хранятся статьи на своем языке.
18 индексов == 18 В каждом индексе хранятся свои документы.
"mappings": {
"article": {"_meta": {"model": "WWW\SearchBundle\Document\Article" },
"_all": {"auto_boost": true },
"properties": {
"keywords": {"index": "not_analyzed","type": "string"},
"description": {"type": "string",
"fields": {
"language": {"type": "string"}
}
},
"title": {"boost": 10,"type": "string",
"fields": {
"total": {"index": "not_analyzed", "type": "string"},
"language": {"type": "string"}
}
}
}
}
Запросы все одинаковые, это типа поисковика:
{
"query": {
"filtered": {
"query": {
"dis_max": {
"queries": [
{
"constant_score": {
"query": {
"multi_match": {
"type": "phrase",
"query": "donald trump us election",
"fields": [
"title"
],
"fuzziness": 0,
"slop": 2
}
},
"boost": 5
}
},
{
"constant_score": {
"query": {
"multi_match": {
"type": "phrase",
"query": "donald trump us election",
"fields": [
"description^5",
"keywords^0.25"
],
"fuzziness": 0,
"slop": 2
}
},
"boost": 2
}
},
{
"constant_score": {
"query": {
"multi_match": {
"type": "best_fields",
"query": "donald trump us election",
"fields": [
"title^2",
"description^0.2",
"keywords^0.25"
],
"fuzziness": 1
}
},
"boost": 0.001
}
}
]
}
}
}
},
"rescore": [
{
"query": {
"rescore_query": {
"function_score": {
"functions": [
{
"gauss": {
"publishedAt": {
"origin": "2016-09-01T10:30:55-04:00",
"scale": "365d",
"decay": 0.5
}
},
"weight": 1
}
]
}
},
"rescore_query_weight": 1,
"query_weight": 1,
"score_mode": "multiply"
},
"window_size": 100000
}
],
}
проблемы присутствуют в двух местах:
- функция rescore. Если запрос популярный, то могут возвращаться порядка 1 000 000 результатов, которые нужно обработать.
- Третий подзапрос с "fuzziness": 1
Включение и отключение "fuzziness": 1 или 0 вызывает броски в быстродействии в 2 раза. При включении нечеткого поиска запрос выполняется примерно 400мс. при отключении - 200мс
замена rescore на сортировку тоже увеличивает быстродействие в 2 раза. для популярных выражений. Для редких статей - влияния не оказывает естественно.
Задача, ускорить запросы раз в 10. Ну или хотябы чтобы меньше 100мс уйти.
Думал сделать фильтрацию результатов, однако не могу, потому что подзапросы возвращают несортированные данные и если резать результаты до 10000, то получается совсем грустно. а если больше - то особого смысла нет. все равно тупит.
Посоветуйте пожалуйста, как мне можно ограничить количественно выдачу из основного запроса, при этом получить наиболее поздние документы, попадающие в выборку, и удовлетворяющие подзапросам.
В данный момент по совокупности в индексах примерно 5 000 000 документов. Самый большой индекс русский (1 200 000 документов ).