yourlabs / django-cities-light

A simple app providing three models: Country, Region and City model. Also provided, a command to insert or update data from geonames database dumps. Status: stable.
http://django-cities-light.rtfd.org/
MIT License
335 stars 126 forks source link

No index on search_names #294

Open ronny-rentner opened 1 week ago

ronny-rentner commented 1 week ago

I am searching for cities using the search_names field. I was surprised to find this code:

# MySQL doesn't support indexing TextFields
INDEX_SEARCH_NAMES = getattr(settings, 'CITIES_LIGHT_INDEX_SEARCH_NAMES', None)
if INDEX_SEARCH_NAMES is None:
    INDEX_SEARCH_NAMES = True
    for database in list(settings.DATABASES.values()):
        if "ENGINE" in database and (
                'mysql' in database.get('ENGINE').lower() or
                'postgresql' in database.get('ENGINE').lower()):
            INDEX_SEARCH_NAMES = False

I am using Postgres. My cities_light_city table has 18 indexes but none on search_names, the field that is intended for search.

It should have an index by default on the search field. The information in settings.py is wrong that MySQL would not support indexes on text fields. The same goes for Postgres which does support indexes on text.

ronny-rentner commented 1 week ago

From the MySQL docs:

MySQL has support for full-text indexing and searching:

    A full-text index in MySQL is an index of type FULLTEXT.

    Full-text indexes can be used only with [InnoDB](https://dev.mysql.com/doc/refman/8.4/en/innodb-storage-engine.html) or [MyISAM](https://dev.mysql.com/doc/refman/8.4/en/myisam-storage-engine.html) tables, and can be created only for [CHAR](https://dev.mysql.com/doc/refman/8.4/en/char.html), [VARCHAR](https://dev.mysql.com/doc/refman/8.4/en/char.html), or [TEXT](https://dev.mysql.com/doc/refman/8.4/en/blob.html) columns.

https://dev.mysql.com/doc/refman/8.4/en/fulltext-search.html