Как выполнить поиск по нескольким полям в django_opensearch_dsl

У меня есть сервер opensearch, на котором я хочу выполнять поиск элементов и применять некоторые фильтры к поиску:

search = Item.search().query("match", name="test")

Мне нужно искать элементы по нескольким фильтрам, таким как название, дата, местоположение и т.д. Для этого мне понадобятся запросы другого типа, такие как "диапазон" или "термины".

Теперь проблема в том, что я пытаюсь использовать opensearch-dsl пакет, подобный этому:

 search_1 = ESQ("match", name="test")
 search_2 = ESQ("terms", name="location")
 search_3 = ESQ("range", name="date")
 filters = [search_1, search_2, search_3]
 query =  ESQ("bool", should=filters)
 search = FreezerItemDocument.search().query(query)

Это не работает, постоянно возвращаются ошибки типа:

{"error":"unhashable type: 'Bool'"}

Событие, если я попытаюсь выполнить запрос по отдельности следующим образом:

 query = ESQ("match", name="test")
 search = FreezerItemDocument.search().query(query)

Как я могу выполнить поиск по нескольким полям?

Я тоже получал ошибку unhashable - другие пользователи не смогли ее воспроизвести. Однако я обнаружил, что изменение

 search = FreezerItemDocument.search().query(query)
от

до

 search = FreezerItemDocument.search().query(query.to_dict())

проблема решена.

Опять же, те, с кем я разговаривал, сочли это запутанным, поскольку django-opensearch-dsl должен автоматически выполнять to_dict(), но у меня это не получилось, поэтому я бы предположил, что у вас то же самое.

Вернуться на верх