Files
searxng/searx/engines/demo_offline.py
T
Markus Heiser dd27fce3b7 [unbload] drop meaningless field `number_of_results_xpath` from results (#6130)
In the result-list, the ``number_of_results`` indicate the number of hits in the
Index, they do not indicate how many results are in the answer.

In the past, search engines such as google or ddg had an indication on the first
page of a search term of how many hits there were for this term in total in
their index.

This info was added up in SearXNG and delivered under ``number_of_results``.
Nowadays the search engines no longer indicate how many hits there are in the
index and so this field in SearXNG is also superfluous.

- https://github.com/searxng/searxng/issues/2457#issuecomment-2566181574
- https://github.com/searxng/searxng/issues/2987
- https://github.com/searxng/searxng/issues/5034

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 12:43:02 +02:00

116 lines
2.9 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Within this module we implement a *demo offline engine*. Do not look to
close to the implementation, its just a simple example.
Configuration
=============
To get in use of this *demo* engine add the following entry to your engines list
in ``settings.yml``:
.. code:: yaml
- name: my offline engine
engine: demo_offline
shortcut: demo
disabled: false
Implementations
===============
"""
import typing as t
import json
from searx.result_types import EngineResults
from searx.enginelib import EngineCache
if t.TYPE_CHECKING:
from searx.search.processors import RequestParams
engine_type = "offline"
categories = ["general"]
disabled = True
timeout = 2.0
about = {
"wikidata_id": None,
"official_api_documentation": None,
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
}
# if there is a need for globals, use a leading underline
_my_offline_engine: str = ""
CACHE: EngineCache
"""Persistent (SQLite) key/value cache that deletes its values after ``expire``
seconds."""
def setup(engine_settings: dict[str, t.Any]) -> bool:
"""Dynamic setup of the engine settings.
The origin of this demo engine is a simple json string which is loaded in
this example while the engine is initialized.
For more details see :py:obj:`searx.enginelib.Engine.setup`.
"""
global _my_offline_engine, CACHE # pylint: disable=global-statement
CACHE = EngineCache(engine_settings["name"])
_my_offline_engine = (
'[ {"value": "%s"}'
', {"value":"first item"}'
', {"value":"second item"}'
', {"value":"third item"}'
']' % engine_settings.get('name')
)
return True
def init(engine_settings: dict[str, t.Any]) -> bool: # pylint: disable=unused-argument
"""Initialization of the engine.
For more details see :py:obj:`searx.enginelib.Engine.init`.
"""
return True
def search(query: str, params: "RequestParams") -> EngineResults:
"""Query (offline) engine and return results. Assemble the list of results
from your local engine.
In this demo engine we ignore the 'query' term, usual you would pass the
'query' term to your local engine to filter out the results.
"""
res = EngineResults()
count: int = CACHE.get("count", 0)
data_rows: list[dict[str, str]] = json.loads(_my_offline_engine)
for row in data_rows:
count += 1
kvmap = {
'query': query,
'language': params['searxng_locale'],
'value': row.get("value"),
}
res.add(
res.types.KeyValue(
caption=f"Demo Offline Engine Result #{count}",
key_title="Name",
value_title="Value",
kvmap=kvmap,
)
)
# cache counter value for 20sec
CACHE.set("count", count, expire=20)
return res