mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-30 18:22:31 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			117 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,
 | |
|             )
 | |
|         )
 | |
|     res.add(res.types.LegacyResult(number_of_results=count))
 | |
| 
 | |
|     # cache counter value for 20sec
 | |
|     CACHE.set("count", count, expire=20)
 | |
|     return res
 |