Как преодолеть ошибку maxClauseCount при использовании запроса multi_match - PullRequest
0 голосов
/ 10 января 2019

У меня есть 10+ Индексы на моем Elasticsearch сервере.

Каждый Индекс имеет 1 или более полей с различными типами Анализаторы : ключевое слово , стандарт , нграм и т. Д. *

Для глобального поиска я использую multi_match без указания явного fields.

Для запросов я использую библиотеку elasticsearch-dsl, код ниже:

def search_for_index(indice, term, num_of_result=10):
    s = Search(index=indice).sort({"_score": "desc"})
    s = s[:num_of_result]
    s = s.query('multi_match', query=term, operator='and')
    response = s.execute()
    return response.to_dict()['hits']['hits']

Я получаю очень хороший результат, и поиск работает просто отлично, но иногда кто-то вводит более длинный текст, и я получаю maxClauseCount ошибку.

Например, поиск, который выдает ошибку, когда условие поиска term равно:

term=We are working on your request and will keep you posted at the earliest.

Или любой другой более длинный текст вызывает ту же ошибку.

Можете ли вы помочь мне разобраться, может быть, какой-нибудь лучший подход для моего глобального поиска, чтобы я мог избежать такого рода ошибок?

1 Ответ

0 голосов
/ 13 января 2019

Прежде всего - это ограничение существует по причине . Чем больше у вас логических предложений, тем тяжелее будет поиск. Думайте об этом как о пересечении (И) или объединении (ИЛИ) поднабора идентификаторов документов для каждого из предложений. Это очень тяжелая операция, поэтому изначально она имеет ограничение в 1024 предложения.

Общая рекомендация - попытаться уменьшить количество полей, которые вы ищете. Возможно, у вас есть поля, которые не содержат текстовых данных или просто имеют некоторые внутренние идентификаторы. Вы можете вычеркнуть их во время запроса multi_match, явно указав секцию fields .

Если вы по-прежнему решили использовать текущий подход и используете Elasticsearch 5.5 + и выше, вы можете изменить их, добавив следующую строку в asticsearch.yml и перезапустить ваш экземпляр.

indices.query.bool.max_clause_count: 250000

Если вы используете до 5 версию Elasticsearch , настройка называется index.query.bool.max_clause_count

...