meilisearch.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. """.. sidebar:: info
  3. - :origin:`meilisearch.py <searx/engines/meilisearch.py>`
  4. - `MeiliSearch <https://www.meilisearch.com>`_
  5. - `MeiliSearch Documentation <https://docs.meilisearch.com/>`_
  6. - `Install MeiliSearch
  7. <https://docs.meilisearch.com/learn/getting_started/installation.html>`_
  8. MeiliSearch_ is aimed at individuals and small companies. It is designed for
  9. small-scale (less than 10 million documents) data collections. E.g. it is great
  10. for storing web pages you have visited and searching in the contents later.
  11. The engine supports faceted search, so you can search in a subset of documents
  12. of the collection. Furthermore, you can search in MeiliSearch_ instances that
  13. require authentication by setting ``auth_token``.
  14. Example
  15. =======
  16. Here is a simple example to query a Meilisearch instance:
  17. .. code:: yaml
  18. - name: meilisearch
  19. engine: meilisearch
  20. shortcut: mes
  21. base_url: http://localhost:7700
  22. index: my-index
  23. enable_http: true
  24. """
  25. # pylint: disable=global-statement
  26. from json import dumps
  27. from searx.result_types import EngineResults
  28. from searx.extended_types import SXNG_Response
  29. base_url = 'http://localhost:7700'
  30. index = ''
  31. auth_key = ''
  32. facet_filters = []
  33. _search_url = ''
  34. categories = ['general']
  35. paging = True
  36. def init(_):
  37. if index == '':
  38. raise ValueError('index cannot be empty')
  39. global _search_url
  40. _search_url = base_url + '/indexes/' + index + '/search'
  41. def request(query, params):
  42. if auth_key != '':
  43. params['headers']['X-Meili-API-Key'] = auth_key
  44. params['headers']['Content-Type'] = 'application/json'
  45. params['url'] = _search_url
  46. params['method'] = 'POST'
  47. data = {
  48. 'q': query,
  49. 'offset': 10 * (params['pageno'] - 1),
  50. 'limit': 10,
  51. }
  52. if len(facet_filters) > 0:
  53. data['facetFilters'] = facet_filters
  54. params['data'] = dumps(data)
  55. return params
  56. def response(resp: SXNG_Response) -> EngineResults:
  57. res = EngineResults()
  58. resp_json = resp.json()
  59. for row in resp_json['hits']:
  60. kvmap = {key: str(value) for key, value in row.items()}
  61. res.add(res.types.KeyValue(kvmap=kvmap))
  62. return res