from typing import List from utils.elastic_search.query_strategy import QueryStrategyType import re UNSAFE_CHARS = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\ / = < > && ||' # noqa: W605 MAX_SIZE = 10000 def escape_query(query: str) -> str: special_chars = UNSAFE_CHARS.split(" ") return re.sub("([{}])".format("\\".join(special_chars)), r"\\\1", query) class ElasticSearchQuery: @staticmethod def default_search( query: str, fields: List[str] = None, strategy: QueryStrategyType = QueryStrategyType.MULTIMATCH_FUZZY_QUERY ) -> dict: safe_query = escape_query(query) if safe_query.isnumeric(): strategy = QueryStrategyType.SIMPLE_QUERY return {"size": MAX_SIZE, "query": strategy.query()(safe_query, fields)}