diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-01-18 23:33:56 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-01-19 18:06:55 +0100 |
commit | c9e7e5478aed8757821827e8f5358d7959257a2d (patch) | |
tree | d27d1e598f6e665f0bd624cc1523440008ba7697 /ishtar_common/models_common.py | |
parent | c2691ba59e40433b46b6c8aa3d362c56e6262788 (diff) | |
download | Ishtar-c9e7e5478aed8757821827e8f5358d7959257a2d.tar.bz2 Ishtar-c9e7e5478aed8757821827e8f5358d7959257a2d.zip |
Free search: "raw" index for reference - improve parent only search
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r-- | ishtar_common/models_common.py | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index a6f9ac0e8..03fe26f0c 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -884,8 +884,36 @@ class FullSearch(models.Model): deactivate() return query_parameters + @classmethod + def _update_raw_search_field(cls, value): + result = [] + if not value: + value = "" + for val in value.split("'"): + result.append(f"'{val.lower()}':1") + SEPS = [" ", "-", "/"] + values = [] + # split ID terms + for idx, sep in enumerate(SEPS): + if not idx: + values = value.split(sep) + continue + new_values = [] + for val in values: + new_values += val.split(sep) + values = new_values + for val in values: + if len(val) < 2: + continue + val = val.replace("'", "").lower() + result.append(f"'{val}':1") + return result + def _update_search_field(self, search_vector_conf, search_vectors, data): for value in search_vector_conf.format(data): + if search_vector_conf.language == "raw": + search_vectors += self._update_raw_search_field(value) + continue with connection.cursor() as cursor: cursor.execute( "SELECT to_tsvector(%s, %s)", [search_vector_conf.language, value] @@ -921,7 +949,7 @@ class FullSearch(models.Model): logger.warning("No search_vectors defined for {}".format(self.__class__)) return if getattr(self, "_search_updated", None): - return + return self.search_vector JsonDataField = apps.get_model("ishtar_common", "JsonDataField") self._search_updated = True @@ -938,6 +966,12 @@ class FullSearch(models.Model): for item in rel_key.values("pk").all(): query_dct = {key + "__pk": item["pk"]} q = copy.copy(base_q).filter(**query_dct) + if m2m_search_vector.language == "raw": + q = q.values_list(m2m_search_vector.key, flat=True) + search_vectors += self._update_raw_search_field(q.all()[0]) + continue + query_dct = {key + "__pk": item["pk"]} + q = copy.copy(base_q).filter(**query_dct) q = q.annotate( search=SearchVector( m2m_search_vector.key, config=m2m_search_vector.language @@ -961,17 +995,17 @@ class FullSearch(models.Model): elif parent: search_vectors.append(parent.search_vector) - for PARENT_ONLY_SEARCH_VECTOR in self.PARENT_ONLY_SEARCH_VECTORS: - parent = getattr(self, PARENT_ONLY_SEARCH_VECTOR) - if hasattr(parent, "all"): # m2m - for p in parent.all(): + for PARENT_ONLY_SEARCH_VECTOR in self.PARENT_ONLY_SEARCH_VECTORS: + parent = getattr(self, PARENT_ONLY_SEARCH_VECTOR) + if hasattr(parent, "all"): # m2m + for p in parent.all(): + search_vectors.append( + p.update_search_vector(save=False, exclude_parent=True) + ) + elif parent: search_vectors.append( - p.update_search_vector(save=False, exclude_parent=True) + parent.update_search_vector(save=False, exclude_parent=True) ) - elif parent: - search_vectors.append( - parent.update_search_vector(save=False, exclude_parent=True) - ) if self.BASE_SEARCH_VECTORS: # query "simple" fields @@ -4110,7 +4144,10 @@ class SearchVectorConfig: value = "" if not self.func: return [value] - return self.func(value) + value = self.func(value) + if not isinstance(value, list): + return [value] + return value class ShortMenuItem: |