| 28 | |
| 29 | |
| 30 | class Query(object): |
| 31 | TEXT_FIELDS = ["text"] |
| 32 | PREFIX_FIELD = "name" |
| 33 | SKIP_FILTERS = [] |
| 34 | AUTHZ_FIELD = "collection_id" |
| 35 | HIGHLIGHT_FIELD = "text" |
| 36 | SORT_FIELDS = { |
| 37 | "label": "label.kw", |
| 38 | "score": "_score", |
| 39 | } |
| 40 | SORT_DEFAULT = ["_score"] |
| 41 | SOURCE = {} |
| 42 | |
| 43 | def __init__(self, parser): |
| 44 | self.parser = parser |
| 45 | |
| 46 | def get_text_query(self): |
| 47 | query = [] |
| 48 | if self.parser.text: |
| 49 | qs = { |
| 50 | "query_string": { |
| 51 | "query": self.parser.text, |
| 52 | "lenient": True, |
| 53 | "fields": self.TEXT_FIELDS, |
| 54 | "default_operator": "AND", |
| 55 | "minimum_should_match": "66%", |
| 56 | } |
| 57 | } |
| 58 | query.append(qs) |
| 59 | if self.parser.prefix: |
| 60 | query.append( |
| 61 | {"match_phrase_prefix": {self.PREFIX_FIELD: self.parser.prefix}} |
| 62 | ) |
| 63 | if not len(query): |
| 64 | query.append({"match_all": {}}) |
| 65 | return query |
| 66 | |
| 67 | def get_filters_list(self, skip): |
| 68 | filters = [] |
| 69 | range_filters = dict() |
| 70 | for field, values in self.parser.filters.items(): |
| 71 | if field in skip: |
| 72 | continue |
| 73 | # Collect all range query filters for a field in a single query |
| 74 | if field.startswith(("gt:", "gte:", "lt:", "lte:")): |
| 75 | op, field = field.split(":", 1) |
| 76 | if range_filters.get(field) is None: |
| 77 | range_filters[field] = {op: list(values)[0]} |
| 78 | else: |
| 79 | range_filters[field][op] = list(values)[0] |
| 80 | continue |
| 81 | filters.append(field_filter_query(field, values)) |
| 82 | |
| 83 | for field, ops in range_filters.items(): |
| 84 | filters.append(range_filter_query(field, ops)) |
| 85 | |
| 86 | return filters |
| 87 | |