{"id":23083,"library":"edx-search","title":"edx-search","description":"Search and indexing routines for Open edX, supporting Elasticsearch, Meilisearch, and Typesense backends. Current version 5.0.0 as of August 2024. Release cadence is roughly quarterly.","status":"active","version":"5.0.0","language":"python","source_language":"en","source_url":"https://github.com/openedx/edx-search","tags":["openedx","search","elasticsearch","meilisearch","typesense"],"install":[{"cmd":"pip install edx-search","lang":"bash","label":"PyPI"}],"dependencies":[{"reason":"Backend for Elasticsearch support (bundled via extra or explicit)","package":"elasticsearch","optional":true},{"reason":"Backend for Meilisearch support (bundled via extra or explicit)","package":"meilisearch","optional":true},{"reason":"Backend for Typesense support (bundled via extra or explicit)","package":"typesense","optional":true}],"imports":[{"note":"Direct import from top-level does not expose SearchEngine; must import from submodule.","wrong":"from search import SearchEngine","symbol":"SearchEngine","correct":"from search.search_engine_base import SearchEngine"}],"quickstart":{"code":"from search.search_engine_base import SearchEngine\nengine = SearchEngine(index_name='my_index', url='http://localhost:7700', api_key=os.environ.get('MEILI_API_KEY', ''))","lang":"python","description":"Initialize a search engine with a Meilisearch backend (default). For Elasticsearch or Typesense, pass appropriate kwargs."},"warnings":[{"fix":"Upgrade Python to 3.12+ and update Django to >=4.2.","message":"Version 5.0.0 introduces a new Typesense backend and drops Python 3.11 support (now requires Python 3.12+). Code using Django <4.2 may break.","severity":"breaking","affected_versions":">=5.0.0"},{"fix":"Update Elasticsearch client to 8.x and adjust import paths (e.g., elasticsearch8).","message":"Version 4.0.0 dropped Python 3.8 support and switched from Elasticsearch 7.x to 8.x. Connection code using old library API will fail.","severity":"breaking","affected_versions":">=4.0.0,<5.0.0"},{"fix":"Upgrade to 4.1.2+ to use this filter.","message":"The 'catalog_visibility' filter in courseware_content was added in 4.1.2; earlier versions ignore it silently.","severity":"deprecated","affected_versions":"<4.1.2"},{"fix":"Always provide 'url' and 'api_key' matching your backend.","message":"Search engine initialization requires explicitly passing backend-specific kwargs (url, api_key). Omitting them defaults to Elasticsearch at localhost:9200 (no auth), which may not exist.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Use: from search.search_engine_base import SearchEngine","cause":"Top-level 'search' package does not export SearchEngine directly.","error":"ImportError: cannot import name 'SearchEngine' from 'search'"},{"fix":"Remove 'api_key' for Elasticsearch or use 'cloud_id' and 'http_auth' for Elasticsearch 8.x.","cause":"Elasticsearch backend does not accept 'api_key' as a keyword, but Meilisearch does.","error":"TypeError: Engine.__init__() got an unexpected keyword argument 'api_key'"},{"cause":"Elasticsearch 8.x client changed API methods.","error":"AttributeError: 'Elasticsearch' object has no attribute 'delete_by_query'","fixed":"Use 'client.delete_by_query(index=..., body=...)' or update to the latest edx-search which wraps it."}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}