mirror of
https://github.com/searxng/searxng.git
synced 2026-05-26 12:50:14 +02:00
dd27fce3b7
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>
102 lines
2.3 KiB
Python
102 lines
2.3 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""MongoDB_ is a document based database program that handles JSON like data.
|
|
Before configuring the ``mongodb`` engine, you must install the dependency
|
|
pymongo_.
|
|
|
|
Configuration
|
|
=============
|
|
|
|
In order to query MongoDB_, you have to select a ``database`` and a
|
|
``collection``. Furthermore, you have to select a ``key`` that is going to be
|
|
searched. MongoDB_ also supports the option ``exact_match_only``, so configure
|
|
it as you wish.
|
|
|
|
Example
|
|
=======
|
|
|
|
Below is an example configuration for using a MongoDB collection:
|
|
|
|
.. code:: yaml
|
|
|
|
# MongoDB engine
|
|
# Required dependency: pymongo
|
|
|
|
- name: mymongo
|
|
engine: mongodb
|
|
shortcut: md
|
|
exact_match_only: false
|
|
host: '127.0.0.1'
|
|
port: 27017
|
|
enable_http: true
|
|
results_per_page: 20
|
|
database: 'business'
|
|
collection: 'reviews' # name of the db collection
|
|
key: 'name' # key in the collection to search for
|
|
|
|
Implementations
|
|
===============
|
|
|
|
"""
|
|
|
|
import re
|
|
|
|
try:
|
|
from pymongo import MongoClient # type: ignore
|
|
except ImportError:
|
|
# import error is ignored because the admin has to install pymongo manually
|
|
# to use the engine
|
|
pass
|
|
|
|
from searx.result_types import EngineResults
|
|
|
|
|
|
engine_type = 'offline'
|
|
|
|
# mongodb connection variables
|
|
host = '127.0.0.1'
|
|
port = 27017
|
|
username = ''
|
|
password = ''
|
|
database = None
|
|
collection = None
|
|
key = None
|
|
|
|
# engine specific variables
|
|
paging = True
|
|
results_per_page = 20
|
|
exact_match_only = False
|
|
|
|
_client = None
|
|
|
|
|
|
def init(_):
|
|
connect()
|
|
|
|
|
|
def connect():
|
|
global _client # pylint: disable=global-statement
|
|
kwargs: dict[str, str | int] = {'port': port}
|
|
if username:
|
|
kwargs['username'] = username
|
|
if password:
|
|
kwargs['password'] = password
|
|
_client = MongoClient(host, **kwargs)[database][collection]
|
|
|
|
|
|
def search(query, params) -> EngineResults:
|
|
res = EngineResults()
|
|
if exact_match_only:
|
|
q = {'$eq': query}
|
|
else:
|
|
_re = re.compile('.*{0}.*'.format(re.escape(query)), re.I | re.M)
|
|
q = {'$regex': _re}
|
|
|
|
query = _client.find({key: q}).skip((params['pageno'] - 1) * results_per_page).limit(results_per_page)
|
|
|
|
for row in query:
|
|
del row['_id']
|
|
kvmap = {str(k): str(v) for k, v in row.items()}
|
|
res.add(res.types.KeyValue(kvmap=kvmap))
|
|
|
|
return res
|