Engine Library¶
Implementations of the framework for the SearXNG engines.
There is a command line for developer purposes and for deeper analysis. Here is an example in which the command line is called in the development environment:
$ ./manage pyenv.cmd bash --norc --noprofile
(py3) python -m searx.enginelib --help
Hint
The long term goal is to modularize all implementations of the engine framework here in this Python package. ToDo:
move implementations of the SearXNG’s engines loader to a new module in the
searx.enginelib
namespace.
- class searx.enginelib.EngineCache(engine_name: str, expire: int | None = None)[source]¶
Persistent (SQLite) key/value cache that deletes its values again after
expire
seconds (default/max:MAXHOLD_TIME
). This class is a wrapper aroundENGINES_CACHE
(ExpireCacheSQLite
).In the git://searx/engines/demo_offline.py engine you can find an exemplary implementation of such a cache other exaples are implemeted in:
For introspection of the DB, jump into developer environment and run command to show cache state:
$ ./manage pyenv.cmd bash --norc --noprofile (py3) python -m searx.enginelib cache state cache tables and key/values =========================== [demo_offline ] 2025-04-22 11:32:50 count --> (int) 4 [startpage ] 2025-04-22 12:32:30 SC_CODE --> (str) fSOBnhEMlDfE20 [duckduckgo ] 2025-04-22 12:32:31 4dff493e.... --> (str) 4-128634958369380006627592672385352473325 [duckduckgo ] 2025-04-22 12:40:06 3e2583e2.... --> (str) 4-263126175288871260472289814259666848451 [radio_browser ] 2025-04-23 11:33:08 servers --> (list) ['https://de2.api.radio-browser.info', ...] [soundcloud ] 2025-04-29 11:40:06 guest_client_id --> (str) EjkRJG0BLNEZquRiPZYdNtJdyGtTuHdp [wolframalpha ] 2025-04-22 12:40:06 code --> (str) 5aa79f86205ad26188e0e26e28fb7ae7 number of tables: 6 number of key/value pairs: 7
In the “cache tables and key/values” section, the table name (engine name) is at first position on the second there is the calculated expire date and on the third and fourth position the key/value is shown.
About duckduckgo: The vqd coode of ddg depends on the query term and therefore the key is a hash value of the query term (to not to store the raw query term).
In the “properties of ENGINES_CACHE” section all properties of the SQLiteAppl / ExpireCache and their last modification date are shown:
properties of ENGINES_CACHE =========================== [last modified: 2025-04-22 11:32:27] DB_SCHEMA : 1 [last modified: 2025-04-22 11:32:27] LAST_MAINTENANCE : [last modified: 2025-04-22 11:32:27] crypt_hash : ca612e3566fdfd7cf7efe... [last modified: 2025-04-22 11:32:30] CACHE-TABLE--demo_offline: demo_offline [last modified: 2025-04-22 11:32:30] CACHE-TABLE--startpage: startpage [last modified: 2025-04-22 11:32:31] CACHE-TABLE--duckduckgo: duckduckgo [last modified: 2025-04-22 11:33:08] CACHE-TABLE--radio_browser: radio_browser [last modified: 2025-04-22 11:40:06] CACHE-TABLE--soundcloud: soundcloud [last modified: 2025-04-22 11:40:06] CACHE-TABLE--wolframalpha: wolframalpha
These properties provide information about the state of the ExpireCache and control the behavior. For example, the maintenance intervals are controlled by the last modification date of the LAST_MAINTENANCE property and the hash value of the password can be used to detect whether the password has been changed (in this case the DB entries can no longer be decrypted and the entire cache must be discarded).
- class searx.enginelib.Engine[source]¶
Class of engine instances build from YAML settings.
Further documentation see General Engine Configuration.
Hint
This class is currently never initialized and only used for type hinting.
- engine_type: str¶
Type of the engine (Search processors)
- language: str¶
For an engine, when there is
language: ...
in the YAML settings the engine does support only this one language:- name: google french engine: google language: fr
- region: str¶
For an engine, when there is
region: ...
in the YAML settings the engine does support only this one region:.. code:: yaml
name: google belgium engine: google region: fr-BE
- traits: EngineTraits¶
Traits of the engine.
- categories: List[str]¶
Specifies to which categories the engine should be added.
- name: str¶
Name that will be used across SearXNG to define this engine. In settings, on the result page ..
- engine: str¶
Name of the python file used to handle requests and responses to and from this search engine (file name from git://searx/engines without
.py
).
- proxies: dict¶
Set proxies for a specific engine (YAML):
proxies : http: socks5://proxy:port https: socks5://proxy:port
- disabled: bool¶
To disable by default the engine, but not deleting it. It will allow the user to manually activate it in the settings.
- about: dict¶
Additional fields describing the engine.
about: website: https://example.com wikidata_id: Q306656 official_api_documentation: https://example.com/api-doc use_official_api: true require_api_key: true results: HTML
- send_accept_language_header: bool¶
When this option is activated, the language (locale) that is selected by the user is used to build and send a
Accept-Language
header in the request to the origin search engine.
- tokens: List[str]¶
A list of secret tokens to make this engine private, more details see Private Engines (tokens).
- searx.enginelib.ENGINES_CACHE = <searx.cache.ExpireCacheSQLite object>¶
Global
searx.cache.ExpireCacheSQLite
instance where the cached values from all engines are stored. The MAXHOLD_TIME is 7 days and the MAINTENANCE_PERIOD is set to two hours.
Engine traits¶
Engine’s traits are fetched from the origin engines and stored in a JSON file
in the data folder. Most often traits are languages and region codes and
their mapping from SearXNG’s representation to the representation in the origin
search engine. For new traits new properties can be added to the class
EngineTraits
.
To load traits from the persistence EngineTraitsMap.from_data
can be
used.
- class searx.enginelib.traits.EngineTraitsEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)[source]¶
Encodes
EngineTraits
to a serializable object, seejson.JSONEncoder
.- default(o)[source]¶
Return dictionary of a
EngineTraits
object.
- class searx.enginelib.traits.EngineTraits(regions: ~typing.Dict[str, str] = <factory>, languages: ~typing.Dict[str, str] = <factory>, all_locale: str | None = None, data_type: ~typing.Literal['traits_v1'] = 'traits_v1', custom: ~typing.Dict[str, ~typing.Dict[str, ~typing.Dict] | ~typing.Iterable[str]] = <factory>)[source]¶
The class is intended to be instantiated for each engine.
- regions: Dict[str, str]¶
Maps SearXNG’s internal representation of a region to the one of the engine.
SearXNG’s internal representation can be parsed by babel and the value is send to the engine:
regions ={ 'fr-BE' : <engine's region name>, } for key, egnine_region regions.items(): searxng_region = babel.Locale.parse(key, sep='-') ...
- languages: Dict[str, str]¶
Maps SearXNG’s internal representation of a language to the one of the engine.
SearXNG’s internal representation can be parsed by babel and the value is send to the engine:
languages = { 'ca' : <engine's language name>, } for key, egnine_lang in languages.items(): searxng_lang = babel.Locale.parse(key) ...
- all_locale: str | None = None¶
To which locale value SearXNG’s
all
language is mapped (shown a “Default language”).
- custom: Dict[str, Dict[str, Dict] | Iterable[str]]¶
A place to store engine’s custom traits, not related to the SearXNG core.
- get_language(searxng_locale: str, default=None)[source]¶
Return engine’s language string that best fits to SearXNG’s locale.
- Parameters:
searxng_locale – SearXNG’s internal representation of locale selected by the user.
default – engine’s default language
The best fits rules are implemented in
searx.locales.get_engine_locale
. Except for the special valueall
which is determined fromEngineTraits.all_locale
.
- get_region(searxng_locale: str, default=None)[source]¶
Return engine’s region string that best fits to SearXNG’s locale.
- Parameters:
searxng_locale – SearXNG’s internal representation of locale selected by the user.
default – engine’s default region
The best fits rules are implemented in
searx.locales.get_engine_locale
. Except for the special valueall
which is determined fromEngineTraits.all_locale
.
- is_locale_supported(searxng_locale: str) bool [source]¶
A locale (SearXNG’s internal representation) is considered to be supported by the engine if the region or the language is supported by the engine.
For verification the functions
EngineTraits.get_region()
andEngineTraits.get_language()
are used.
- classmethod fetch_traits(engine: Engine) 'EngineTraits' | None [source]¶
Call a function
fetch_traits(engine_traits)
from engines namespace to fetch and set properties from the origin engine in the objectengine_traits
. If function does not exists,None
is returned.
- set_traits(engine: Engine)[source]¶
Set traits from self object in a
Engine
namespace.- Parameters:
engine – engine instance build by
searx.engines.load_engine()
- class searx.enginelib.traits.EngineTraitsMap[source]¶
A python dictionary to map
EngineTraits
by engine name.- ENGINE_TRAITS_FILE = PosixPath('/home/runner/work/searxng/searxng/searx/data/engine_traits.json')¶
File with persistence of the
EngineTraitsMap
.
- classmethod from_data() EngineTraitsMap [source]¶
Instantiate
EngineTraitsMap
object fromENGINE_TRAITS
- set_traits(engine: Engine | types.ModuleType)[source]¶
Set traits in a
Engine
namespace.- Parameters:
engine – engine instance build by
searx.engines.load_engine()