X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/d35400a7d7655e777224db9beddb44a68f4f2949..fc038261b9fe7f7d89a4000496185e72ac100a2a:/nominatim/tokenizer/icu_tokenizer.py diff --git a/nominatim/tokenizer/icu_tokenizer.py b/nominatim/tokenizer/icu_tokenizer.py index 12d1eccd..90caec1c 100644 --- a/nominatim/tokenizer/icu_tokenizer.py +++ b/nominatim/tokenizer/icu_tokenizer.py @@ -2,7 +2,6 @@ Tokenizer implementing normalisation as used before Nominatim 4 but using libICU instead of the PostgreSQL module. """ -from collections import Counter import itertools import json import logging @@ -10,7 +9,6 @@ import re from textwrap import dedent from nominatim.db.connection import connect -from nominatim.db.properties import set_property, get_property from nominatim.db.utils import CopyBuffer from nominatim.db.sql_preprocessor import SQLPreprocessor from nominatim.indexer.place_info import PlaceInfo @@ -37,7 +35,6 @@ class LegacyICUTokenizer(AbstractTokenizer): self.dsn = dsn self.data_dir = data_dir self.loader = None - self.term_normalization = None def init_new_db(self, config, init_db=True): @@ -48,8 +45,6 @@ class LegacyICUTokenizer(AbstractTokenizer): """ self.loader = ICURuleLoader(config) - self.term_normalization = config.TERM_NORMALIZATION - self._install_php(config.lib_dir.php) self._save_config() @@ -65,13 +60,15 @@ class LegacyICUTokenizer(AbstractTokenizer): with connect(self.dsn) as conn: self.loader.load_config_from_db(conn) - self.term_normalization = get_property(conn, DBCFG_TERM_NORMALIZATION) - def finalize_import(self, _): + def finalize_import(self, config): """ Do any required postprocessing to make the tokenizer data ready for use. """ + with connect(self.dsn) as conn: + sqlp = SQLPreprocessor(conn, config) + sqlp.run_sql_file(conn, 'tokenizer/legacy_tokenizer_indices.sql') def update_sql_functions(self, config): @@ -85,12 +82,28 @@ class LegacyICUTokenizer(AbstractTokenizer): def check_database(self, config): """ Check that the tokenizer is set up correctly. """ + # Will throw an error if there is an issue. self.init_from_project(config) - if self.term_normalization is None: - return "Configuration for tokenizer 'icu' are missing." - return None + def update_statistics(self): + """ Recompute frequencies for all name words. + """ + with connect(self.dsn) as conn: + if conn.table_exists('search_name'): + with conn.cursor() as cur: + cur.drop_table("word_frequencies") + LOG.info("Computing word frequencies") + cur.execute("""CREATE TEMP TABLE word_frequencies AS + SELECT unnest(name_vector) as id, count(*) + FROM search_name GROUP BY id""") + cur.execute("CREATE INDEX ON word_frequencies(id)") + LOG.info("Update word table with recomputed frequencies") + cur.execute("""UPDATE word + SET info = info || jsonb_build_object('count', count) + FROM word_frequencies WHERE word_id = id""") + cur.drop_table("word_frequencies") + conn.commit() def name_analyzer(self): @@ -119,7 +132,7 @@ class LegacyICUTokenizer(AbstractTokenizer): php_file.write_text(dedent(f"""\