From b73f755487d767e6f9e99b90821967cd4534f802 Mon Sep 17 00:00:00 2001
From: Feanil Patel <feanil@edx.org>
Date: Thu, 22 Oct 2020 15:53:57 -0400
Subject: [PATCH] Revert "Feanil/edx search update (#25406)" (#25412)

This reverts commit 581b20056d85c54f18cb1590f8cb4564e671cafe.
---
 .../contentstore/courseware_index.py          | 47 ++++++-----------
 .../management/commands/reindex_course.py     | 40 ++++++++------
 .../contentstore/signals/handlers.py          |  4 +-
 .../tests/test_courseware_index.py            | 52 ++++++++-----------
 cms/envs/production.py                        |  3 +-
 lms/djangoapps/course_api/tests/test_views.py |  2 +-
 lms/djangoapps/teams/search_indexes.py        |  4 +-
 lms/envs/production.py                        |  3 +-
 requirements/edx/base.in                      |  2 +-
 requirements/edx/base.txt                     |  6 +--
 requirements/edx/development.txt              |  8 +--
 requirements/edx/github.in                    |  4 --
 requirements/edx/testing.txt                  |  6 +--
 13 files changed, 78 insertions(+), 103 deletions(-)

diff --git a/cms/djangoapps/contentstore/courseware_index.py b/cms/djangoapps/contentstore/courseware_index.py
index ae9c36edf02..1896c60c08d 100644
--- a/cms/djangoapps/contentstore/courseware_index.py
+++ b/cms/djangoapps/contentstore/courseware_index.py
@@ -64,6 +64,7 @@ class SearchIndexerBase(object, metaclass=ABCMeta):
     """
 
     INDEX_NAME = None
+    DOCUMENT_TYPE = None
     ENABLE_INDEXING_KEY = None
 
     INDEX_EVENT = {
@@ -105,11 +106,12 @@ class SearchIndexerBase(object, metaclass=ABCMeta):
         as we find items we can shorten the set of items to keep
         """
         response = searcher.search(
+            doc_type=cls.DOCUMENT_TYPE,
             field_dictionary=cls._get_location_info(structure_key),
             exclude_dictionary={"id": list(exclude_items)}
         )
         result_ids = [result["data"]["id"] for result in response["results"]]
-        searcher.remove(result_ids)
+        searcher.remove(cls.DOCUMENT_TYPE, result_ids)
 
     @classmethod
     def index(cls, modulestore, structure_key, triggered_at=None, reindex_age=REINDEX_AGE):
@@ -254,7 +256,7 @@ class SearchIndexerBase(object, metaclass=ABCMeta):
                 # Now index the content
                 for item in structure.get_children():
                     prepare_item_index(item, groups_usage_info=groups_usage_info)
-                searcher.index(items_index)
+                searcher.index(cls.DOCUMENT_TYPE, items_index)
                 cls.remove_deleted_items(searcher, structure_key, indexed_items)
         except Exception as err:  # pylint: disable=broad-except
             # broad exception so that index operation does not prevent the rest of the application from working
@@ -338,7 +340,8 @@ class CoursewareSearchIndexer(SearchIndexerBase):
     """
     Class to perform indexing for courseware search from different modulestores
     """
-    INDEX_NAME = "courseware_content"
+    INDEX_NAME = "courseware_index"
+    DOCUMENT_TYPE = "courseware_content"
     ENABLE_INDEXING_KEY = 'ENABLE_COURSEWARE_INDEX'
 
     INDEX_EVENT = {
@@ -370,24 +373,6 @@ class CoursewareSearchIndexer(SearchIndexerBase):
         """
         return cls._do_reindex(modulestore, course_key)
 
-    @classmethod
-    def _do_reindex(cls, modulestore, structure_key):
-        """
-        (Re)index course content within the given structure.
-
-        The course_info index is indexed with the courseware_content index. This method
-        helps to track the fact that course_info reindex has taken place.
-        """
-        indexed_count = super()._do_reindex(modulestore, structure_key)
-        if indexed_count:
-            course_about = CourseAboutSearchIndexer
-            cls._track_index_request(
-                course_about.INDEX_EVENT['name'],
-                course_about.INDEX_EVENT['category'],
-                indexed_count
-            )
-        return indexed_count
-
     @classmethod
     def fetch_group_usage(cls, modulestore, structure):
         groups_usage_dict = {}
@@ -445,6 +430,7 @@ class LibrarySearchIndexer(SearchIndexerBase):
     Base class to perform indexing for library search from different modulestores
     """
     INDEX_NAME = "library_index"
+    DOCUMENT_TYPE = "library_content"
     ENABLE_INDEXING_KEY = 'ENABLE_LIBRARY_INDEX'
 
     INDEX_EVENT = {
@@ -545,16 +531,12 @@ class AboutInfo(object):
     FROM_COURSE_MODE = from_course_mode
 
 
-class CourseAboutSearchIndexer(CoursewareSearchIndexer):
+class CourseAboutSearchIndexer(object):
     """
     Class to perform indexing of about information from course object
     """
-    INDEX_NAME = "course_info"
-
-    INDEX_EVENT = {
-        'name': 'edx.course_info.index.reindexed',
-        'category': 'course_info'
-    }
+    DISCOVERY_DOCUMENT_TYPE = "course_info"
+    INDEX_NAME = CoursewareSearchIndexer.INDEX_NAME
 
     # List of properties to add to the index - each item in the list is an instance of AboutInfo object
     ABOUT_INFORMATION_TO_INCLUDE = [
@@ -644,7 +626,7 @@ class CourseAboutSearchIndexer(CoursewareSearchIndexer):
 
         # Broad exception handler to protect around and report problems with indexing
         try:
-            searcher.index([course_info])
+            searcher.index(cls.DISCOVERY_DOCUMENT_TYPE, [course_info])
         except:
             log.exception(
                 u"Course discovery indexing error encountered, course discovery index may be out of date %s",
@@ -669,6 +651,9 @@ class CourseAboutSearchIndexer(CoursewareSearchIndexer):
         if not searcher:
             return
 
-        response = searcher.search(field_dictionary=cls._get_location_info(structure_key))
+        response = searcher.search(
+            doc_type=cls.DISCOVERY_DOCUMENT_TYPE,
+            field_dictionary=cls._get_location_info(structure_key)
+        )
         result_ids = [result["data"]["id"] for result in response["results"]]
-        searcher.remove(result_ids)
+        searcher.remove(cls.DISCOVERY_DOCUMENT_TYPE, result_ids)
diff --git a/cms/djangoapps/contentstore/management/commands/reindex_course.py b/cms/djangoapps/contentstore/management/commands/reindex_course.py
index 9d5ccf4291d..13ed166470f 100644
--- a/cms/djangoapps/contentstore/management/commands/reindex_course.py
+++ b/cms/djangoapps/contentstore/management/commands/reindex_course.py
@@ -12,7 +12,7 @@ from opaque_keys.edx.locator import CourseLocator
 from search.search_engine_base import SearchEngine
 from six.moves import map
 
-from cms.djangoapps.contentstore.courseware_index import CoursewareSearchIndexer, CourseAboutSearchIndexer
+from cms.djangoapps.contentstore.courseware_index import CoursewareSearchIndexer
 from xmodule.modulestore.django import modulestore
 
 from .prompt import query_yes_no
@@ -71,23 +71,29 @@ class Command(BaseCommand):
         store = modulestore()
 
         if index_all_courses_option:
-            index_names = (CoursewareSearchIndexer.INDEX_NAME, CourseAboutSearchIndexer.INDEX_NAME)
+            index_name = CoursewareSearchIndexer.INDEX_NAME
+            doc_type = CoursewareSearchIndexer.DOCUMENT_TYPE
             if setup_option:
-                for index_name in index_names:
-                    try:
-                        searcher = SearchEngine.get_search_engine(index_name)
-                    except exceptions.ElasticsearchException as exc:
-                        logging.exception(u'Search Engine error - %s', exc)
-                        return
-
-                    index_exists = searcher._es.indices.exists(index=index_name)  # pylint: disable=protected-access
-
-                    index_mapping = searcher._es.indices.get_mapping(  # pylint: disable=protected-access
-                        index=index_name,
-                    ) if index_exists else {}
-
-                    if index_exists and index_mapping:
-                        return
+                try:
+                    # try getting the ElasticSearch engine
+                    searcher = SearchEngine.get_search_engine(index_name)
+                except exceptions.ElasticsearchException as exc:
+                    logging.exception(u'Search Engine error - %s', exc)
+                    return
+
+                index_exists = searcher._es.indices.exists(index=index_name)  # pylint: disable=protected-access
+                doc_type_exists = searcher._es.indices.exists_type(  # pylint: disable=protected-access
+                    index=index_name,
+                    doc_type=doc_type
+                )
+
+                index_mapping = searcher._es.indices.get_mapping(  # pylint: disable=protected-access
+                    index=index_name,
+                    doc_type=doc_type
+                ) if index_exists and doc_type_exists else {}
+
+                if index_exists and index_mapping:
+                    return
 
             # if reindexing is done during devstack setup step, don't prompt the user
             if setup_option or query_yes_no(self.CONFIRMATION_PROMPT, default="no"):
diff --git a/cms/djangoapps/contentstore/signals/handlers.py b/cms/djangoapps/contentstore/signals/handlers.py
index bdcf36ab21a..b40d4f1b27c 100644
--- a/cms/djangoapps/contentstore/signals/handlers.py
+++ b/cms/djangoapps/contentstore/signals/handlers.py
@@ -10,7 +10,7 @@ from django.core.cache import cache
 from django.dispatch import receiver
 from pytz import UTC
 
-from cms.djangoapps.contentstore.courseware_index import CoursewareSearchIndexer, CourseAboutSearchIndexer, LibrarySearchIndexer
+from cms.djangoapps.contentstore.courseware_index import CoursewareSearchIndexer, LibrarySearchIndexer
 from cms.djangoapps.contentstore.proctoring import register_special_exams
 from lms.djangoapps.grades.api import task_compute_all_grades_for_course
 from openedx.core.djangoapps.credit.signals import on_course_publish
@@ -62,7 +62,7 @@ def listen_for_course_publish(sender, course_key, **kwargs):  # pylint: disable=
 
     # Finally call into the course search subsystem
     # to kick off an indexing action
-    if CoursewareSearchIndexer.indexing_is_enabled() and CourseAboutSearchIndexer.indexing_is_enabled():
+    if CoursewareSearchIndexer.indexing_is_enabled():
         # import here, because signal is registered at startup, but items in tasks are not yet able to be loaded
         from cms.djangoapps.contentstore.tasks import update_search_index
 
diff --git a/cms/djangoapps/contentstore/tests/test_courseware_index.py b/cms/djangoapps/contentstore/tests/test_courseware_index.py
index 6eb07d37251..679ed9e39e6 100644
--- a/cms/djangoapps/contentstore/tests/test_courseware_index.py
+++ b/cms/djangoapps/contentstore/tests/test_courseware_index.py
@@ -137,6 +137,7 @@ class MixedWithOptionsTestCase(MixedSplitTestCase):
     }
 
     INDEX_NAME = None
+    DOCUMENT_TYPE = None
 
     def setup_course_base(self, store):
         """ base version of setup_course_base is a no-op """
@@ -154,7 +155,7 @@ class MixedWithOptionsTestCase(MixedSplitTestCase):
     def search(self, field_dictionary=None, query_string=None):
         """ Performs index search according to passed parameters """
         fields = field_dictionary if field_dictionary else self._get_default_search()
-        return self.searcher.search(query_string=query_string, field_dictionary=fields)
+        return self.searcher.search(query_string=query_string, field_dictionary=fields, doc_type=self.DOCUMENT_TYPE)
 
     def _perform_test_using_store(self, store_type, test_to_perform):
         """ Helper method to run a test function that uses a specific store """
@@ -247,6 +248,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         )
 
     INDEX_NAME = CoursewareSearchIndexer.INDEX_NAME
+    DOCUMENT_TYPE = CoursewareSearchIndexer.DOCUMENT_TYPE
 
     def reindex_course(self, store):
         """ kick off complete reindex of the course """
@@ -313,7 +315,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         """
         Test that course will also be delete from search_index after course deletion.
         """
-        self.searcher = SearchEngine.get_search_engine(CourseAboutSearchIndexer.INDEX_NAME)
+        self.DOCUMENT_TYPE = 'course_info'  # pylint: disable=invalid-name
         response = self.search()
         self.assertEqual(response["total"], 0)
 
@@ -420,43 +422,34 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         self.assertEqual(indexed_count, 7)
 
     def _test_course_about_property_index(self, store):
-        """
-        Test that informational properties in the course object end up in the course_info index.
-        """
-        self.searcher = SearchEngine.get_search_engine(CourseAboutSearchIndexer.INDEX_NAME)
+        """ Test that informational properties in the course object end up in the course_info index """
         display_name = "Help, I need somebody!"
         self.course.display_name = display_name
         self.update_item(store, self.course)
         self.reindex_course(store)
         response = self.searcher.search(
+            doc_type=CourseAboutSearchIndexer.DISCOVERY_DOCUMENT_TYPE,
             field_dictionary={"course": six.text_type(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
         self.assertEqual(response["results"][0]["data"]["content"]["display_name"], display_name)
 
     def _test_course_about_store_index(self, store):
-        """
-        Test that informational properties in the about store end up in
-        the course_info index.
-        """
-        self.searcher = SearchEngine.get_search_engine(CourseAboutSearchIndexer.INDEX_NAME)
+        """ Test that informational properties in the about store end up in the course_info index """
         short_description = "Not just anybody"
         CourseDetails.update_about_item(
             self.course, "short_description", short_description, ModuleStoreEnum.UserID.test, store
         )
         self.reindex_course(store)
         response = self.searcher.search(
+            doc_type=CourseAboutSearchIndexer.DISCOVERY_DOCUMENT_TYPE,
             field_dictionary={"course": six.text_type(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
         self.assertEqual(response["results"][0]["data"]["content"]["short_description"], short_description)
 
     def _test_course_about_mode_index(self, store):
-        """
-        Test that informational properties in the course modes store end up in
-        the course_info index.
-        """
-        self.searcher = SearchEngine.get_search_engine(CourseAboutSearchIndexer.INDEX_NAME)
+        """ Test that informational properties in the course modes store end up in the course_info index """
         honour_mode = CourseModeFactory(
             course_id=self.course.id,
             mode_slug=CourseMode.HONOR,
@@ -473,6 +466,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         self.reindex_course(store)
 
         response = self.searcher.search(
+            doc_type=CourseAboutSearchIndexer.DISCOVERY_DOCUMENT_TYPE,
             field_dictionary={"course": six.text_type(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
@@ -592,15 +586,13 @@ class TestLargeCourseDeletions(MixedWithOptionsTestCase):
     WORKS_WITH_STORES = (ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
 
     def _clean_course_id(self):
-        """
-        Clean all documents from the index that have a specific course provided.
-        """
+        """ Clean all documents from the index that have a specific course provided """
         if self.course_id:
 
             response = self.searcher.search(field_dictionary={"course": self.course_id})
             while response["total"] > 0:
                 for item in response["results"]:
-                    self.searcher.remove(item["data"]["id"])
+                    self.searcher.remove(CoursewareSearchIndexer.DOCUMENT_TYPE, item["data"]["id"])
                 response = self.searcher.search(field_dictionary={"course": self.course_id})
         self.course_id = None
 
@@ -733,12 +725,10 @@ class TestTaskExecution(SharedModuleStoreTestCase):
         super(TestTaskExecution, cls).tearDownClass()
 
     def test_task_indexing_course(self):
-        """
-        Making sure that the receiver correctly fires off the task when invoked
-        by signal.
-        """
+        """ Making sure that the receiver correctly fires off the task when invoked by signal """
         searcher = SearchEngine.get_search_engine(CoursewareSearchIndexer.INDEX_NAME)
         response = searcher.search(
+            doc_type=CoursewareSearchIndexer.DOCUMENT_TYPE,
             field_dictionary={"course": six.text_type(self.course.id)}
         )
         self.assertEqual(response["total"], 0)
@@ -747,6 +737,7 @@ class TestTaskExecution(SharedModuleStoreTestCase):
 
         # Note that this test will only succeed if celery is working in inline mode
         response = searcher.search(
+            doc_type=CoursewareSearchIndexer.DOCUMENT_TYPE,
             field_dictionary={"course": six.text_type(self.course.id)}
         )
         self.assertEqual(response["total"], 3)
@@ -816,6 +807,7 @@ class TestLibrarySearchIndexer(MixedWithOptionsTestCase):
         )
 
     INDEX_NAME = LibrarySearchIndexer.INDEX_NAME
+    DOCUMENT_TYPE = LibrarySearchIndexer.DOCUMENT_TYPE
 
     def _get_default_search(self):
         """ Returns field_dictionary for default search """
@@ -1231,24 +1223,22 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         """
         Return content values from args tuple in a mocked calls list.
         """
-        call = mock_index.call_args
-        (indexed_content, ), kwargs = call  # pylint: disable=unused-variable
-        return indexed_content
+        kall = mock_index.call_args
+        args, kwargs = kall  # pylint: disable=unused-variable
+        return args[1]
 
     def reindex_course(self, store):
         """ kick off complete reindex of the course """
         return CoursewareSearchIndexer.do_course_reindex(store, self.course.id)
 
     def test_content_group_gets_indexed(self):
-        """
-        Indexing course with content groups added test.
-        """
+        """ indexing course with content groups added test """
 
         # Only published modules should be in the index
         added_to_index = self.reindex_course(self.store)
         self.assertEqual(added_to_index, 16)
         response = self.searcher.search(field_dictionary={"course": six.text_type(self.course.id)})
-        self.assertEqual(response["total"], 16)
+        self.assertEqual(response["total"], 17)
 
         group_access_content = {'group_access': {666: [1]}}
 
diff --git a/cms/envs/production.py b/cms/envs/production.py
index cd515fcb56d..ac11b296627 100644
--- a/cms/envs/production.py
+++ b/cms/envs/production.py
@@ -478,8 +478,7 @@ if FEATURES['ENABLE_COURSEWARE_INDEX'] or FEATURES['ENABLE_LIBRARY_INDEX'] or FE
     # Use ElasticSearch for the search engine
     SEARCH_ENGINE = "search.elastic.ElasticSearchEngine"
 
-# TODO: Once we have successfully upgraded to ES7, switch this back to ELASTIC_SEARCH_CONFIG.
-ELASTIC_SEARCH_CONFIG = ENV_TOKENS.get('ELASTIC_SEARCH_CONFIG_ES7', [{}])
+ELASTIC_SEARCH_CONFIG = ENV_TOKENS.get('ELASTIC_SEARCH_CONFIG', [{}])
 
 XBLOCK_SETTINGS = ENV_TOKENS.get('XBLOCK_SETTINGS', {})
 XBLOCK_SETTINGS.setdefault("VideoBlock", {})["licensing_enabled"] = FEATURES.get("LICENSING", False)
diff --git a/lms/djangoapps/course_api/tests/test_views.py b/lms/djangoapps/course_api/tests/test_views.py
index d07090f85c4..2369b622360 100644
--- a/lms/djangoapps/course_api/tests/test_views.py
+++ b/lms/djangoapps/course_api/tests/test_views.py
@@ -286,7 +286,7 @@ class CourseDetailViewTestCase(CourseApiTestViewMixin, SharedModuleStoreTestCase
     'enrollment_end': {'type': 'date'}
 })
 @override_settings(SEARCH_ENGINE="search.tests.mock_search_engine.MockSearchEngine")
-@override_settings(COURSEWARE_INFO_INDEX_NAME=TEST_INDEX_NAME)
+@override_settings(COURSEWARE_INDEX_NAME=TEST_INDEX_NAME)
 class CourseListSearchViewTest(CourseApiTestViewMixin, ModuleStoreTestCase, SearcherMixin):
     """
     Tests the search functionality of the courses API.
diff --git a/lms/djangoapps/teams/search_indexes.py b/lms/djangoapps/teams/search_indexes.py
index 32da8d5ae12..32ffcd90927 100644
--- a/lms/djangoapps/teams/search_indexes.py
+++ b/lms/djangoapps/teams/search_indexes.py
@@ -104,7 +104,7 @@ class CourseTeamIndexer(object):
         """
         search_engine = cls.engine()
         serialized_course_team = CourseTeamIndexer(course_team).data()
-        search_engine.index([serialized_course_team])
+        search_engine.index(cls.DOCUMENT_TYPE_NAME, [serialized_course_team])
 
     @classmethod
     @if_search_enabled
@@ -112,7 +112,7 @@ class CourseTeamIndexer(object):
         """
         Remove course_team from the index (if feature is enabled).
         """
-        cls.engine().remove([course_team.team_id])
+        cls.engine().remove(cls.DOCUMENT_TYPE_NAME, [course_team.team_id])
 
     @classmethod
     @if_search_enabled
diff --git a/lms/envs/production.py b/lms/envs/production.py
index 5018bf8b68a..8a48fcdfc91 100644
--- a/lms/envs/production.py
+++ b/lms/envs/production.py
@@ -723,8 +723,7 @@ if FEATURES.get('ENABLE_COURSEWARE_SEARCH') or \
     SEARCH_ENGINE = "search.elastic.ElasticSearchEngine"
     SEARCH_FILTER_GENERATOR = ENV_TOKENS.get('SEARCH_FILTER_GENERATOR', SEARCH_FILTER_GENERATOR)
 
-# TODO: Once we have successfully upgraded to ES7, switch this back to ELASTIC_SEARCH_CONFIG.
-ELASTIC_SEARCH_CONFIG = ENV_TOKENS.get('ELASTIC_SEARCH_CONFIG_ES7', [{}])
+ELASTIC_SEARCH_CONFIG = ENV_TOKENS.get('ELASTIC_SEARCH_CONFIG', [{}])
 
 # Facebook app
 FACEBOOK_API_VERSION = AUTH_TOKENS.get("FACEBOOK_API_VERSION")
diff --git a/requirements/edx/base.in b/requirements/edx/base.in
index a5215c290ff..360af1a1826 100644
--- a/requirements/edx/base.in
+++ b/requirements/edx/base.in
@@ -86,7 +86,7 @@ edx-organizations
 edx-proctoring>=2.0.1
 edx-proctoring-proctortrack==1.0.5  # Intentionally and permanently pinned to ensure code changes are reviewed
 edx-rest-api-client
-
+edx-search
 edx-sga
 edx-submissions
 edx-user-state-client
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index b23c8f8ac4e..4a58d8bbf31 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -32,7 +32,7 @@ boto==2.39.0              # via -r requirements/edx/base.in, edxval
 botocore==1.8.17          # via -r requirements/edx/base.in, boto3, s3transfer
 bridgekeeper==0.9         # via -r requirements/edx/base.in
 celery==4.4.7             # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in, django-celery-results, django-user-tasks, edx-celeryutils, edx-enterprise, event-tracking
-certifi==2020.6.20        # via -r requirements/edx/paver.txt, elasticsearch, requests
+certifi==2020.6.20        # via -r requirements/edx/paver.txt, requests
 cffi==1.14.3              # via -r requirements/edx/../edx-sandbox/shared.txt, cryptography
 chardet==3.0.4            # via -r requirements/edx/paver.txt, pysrt, requests
 chem==1.2.0               # via -r requirements/edx/base.in
@@ -107,14 +107,14 @@ edx-proctoring-proctortrack==1.0.5  # via -r requirements/edx/base.in
 edx-proctoring==2.4.8     # via -r requirements/edx/base.in, edx-proctoring-proctortrack
 edx-rbac==1.3.3           # via edx-enterprise
 edx-rest-api-client==5.2.1  # via -r requirements/edx/base.in, edx-enterprise, edx-proctoring
-git+https://github.com/raccoongang/edx-search.git@golub-sergey/BD-19/transition-from-ES1.5-to-ES7  # via -r requirements/edx/github.in
+edx-search==1.4.1         # via -r requirements/edx/base.in
 edx-sga==0.11.1           # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in
 edx-submissions==3.2.2    # via -r requirements/edx/base.in, ora2
 edx-tincan-py35==0.0.9    # via edx-enterprise
 edx-user-state-client==1.2.0  # via -r requirements/edx/base.in
 edx-when==1.3.0           # via -r requirements/edx/base.in, edx-proctoring
 edxval==1.4.2             # via -r requirements/edx/base.in
-elasticsearch==7.9.1      # via edx-search
+elasticsearch==1.9.0      # via edx-search
 enmerkar-underscore==1.0.0  # via -r requirements/edx/base.in
 enmerkar==0.7.1           # via enmerkar-underscore
 event-tracking==1.0.0     # via -r requirements/edx/base.in, edx-proctoring, edx-search
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 9e4d06b4a05..0fbf0d63f1f 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -36,7 +36,7 @@ boto==2.39.0              # via -r requirements/edx/testing.txt, edxval
 botocore==1.8.17          # via -r requirements/edx/testing.txt, boto3, s3transfer
 bridgekeeper==0.9         # via -r requirements/edx/testing.txt
 celery==4.4.7             # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, django-celery-results, django-user-tasks, edx-celeryutils, edx-enterprise, event-tracking
-certifi==2020.6.20        # via -r requirements/edx/testing.txt, elasticsearch, requests
+certifi==2020.6.20        # via -r requirements/edx/testing.txt, requests
 cffi==1.14.3              # via -r requirements/edx/testing.txt, cryptography
 chardet==3.0.4            # via -r requirements/edx/testing.txt, pysrt, requests
 chem==1.2.0               # via -r requirements/edx/testing.txt
@@ -119,7 +119,7 @@ edx-proctoring-proctortrack==1.0.5  # via -r requirements/edx/testing.txt
 edx-proctoring==2.4.8     # via -r requirements/edx/testing.txt, edx-proctoring-proctortrack
 edx-rbac==1.3.3           # via -r requirements/edx/testing.txt, edx-enterprise
 edx-rest-api-client==5.2.1  # via -r requirements/edx/testing.txt, edx-enterprise, edx-proctoring
-git+https://github.com/raccoongang/edx-search.git@golub-sergey/BD-19/transition-from-ES1.5-to-ES7  # via -r requirements/edx/testing.txt
+edx-search==1.4.1         # via -r requirements/edx/testing.txt
 edx-sga==0.11.1           # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
 edx-sphinx-theme==1.5.0   # via -r requirements/edx/development.in
 edx-submissions==3.2.2    # via -r requirements/edx/testing.txt, ora2
@@ -127,7 +127,7 @@ edx-tincan-py35==0.0.9    # via -r requirements/edx/testing.txt, edx-enterprise
 edx-user-state-client==1.2.0  # via -r requirements/edx/testing.txt
 edx-when==1.3.0           # via -r requirements/edx/testing.txt, edx-proctoring
 edxval==1.4.2             # via -r requirements/edx/testing.txt
-elasticsearch==7.9.1      # via -r requirements/edx/testing.txt, edx-search
+elasticsearch==1.9.0      # via -r requirements/edx/testing.txt, edx-search
 enmerkar-underscore==1.0.0  # via -r requirements/edx/testing.txt
 enmerkar==0.7.1           # via -r requirements/edx/testing.txt, enmerkar-underscore
 event-tracking==1.0.0     # via -r requirements/edx/testing.txt, edx-proctoring, edx-search
@@ -267,7 +267,7 @@ semantic-version==2.8.5   # via -r requirements/edx/testing.txt, edx-drf-extensi
 shapely==1.7.1            # via -r requirements/edx/testing.txt
 simplejson==3.17.2        # via -r requirements/edx/testing.txt, sailthru-client, super-csv, xblock-utils
 singledispatch==3.4.0.3   # via -r requirements/edx/testing.txt
-six==1.15.0               # via -r requirements/edx/pip-tools.txt, -r requirements/edx/testing.txt, analytics-python, astroid, bleach, bok-choy, chem, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, django-statici18n, django-wiki, drf-yasg, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-opaque-keys, edx-rbac, edx-sphinx-theme, event-tracking, freezegun, fs, fs-s3fs, help-tokens, html5lib, httpretty, isodate, jsonschema, libsass, mock, openedx-calc, packaging, pathlib2, paver, pip-tools, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, sphinxcontrib-httpdomain, stevedore, tox, transifex-client, virtualenv, xblock
+six==1.15.0               # via -r requirements/edx/pip-tools.txt, -r requirements/edx/testing.txt, analytics-python, astroid, bleach, bok-choy, chem, crowdsourcehinter-xblock, cryptography, django-countries, django-simple-history, django-wiki, drf-yasg, edx-ace, edx-bulk-grades, edx-ccx-keys, edx-django-release-util, edx-drf-extensions, edx-enterprise, edx-i18n-tools, edx-lint, edx-milestones, edx-opaque-keys, edx-rbac, edx-search, edx-sphinx-theme, event-tracking, freezegun, fs, fs-s3fs, help-tokens, html5lib, httpretty, isodate, jsonschema, libsass, mock, openedx-calc, packaging, pathlib2, paver, pip-tools, pycontracts, pyjwkest, python-dateutil, python-memcached, python-swiftclient, singledispatch, social-auth-app-django, social-auth-core, sphinxcontrib-httpdomain, stevedore, tox, transifex-client, virtualenv, xblock
 slumber==0.7.1            # via -r requirements/edx/testing.txt, edx-bulk-grades, edx-enterprise, edx-rest-api-client
 smmap==3.0.4              # via -r requirements/edx/testing.txt, gitdb
 snowballstemmer==2.0.0    # via sphinx
diff --git a/requirements/edx/github.in b/requirements/edx/github.in
index e6d2a1265f5..f59cda71490 100644
--- a/requirements/edx/github.in
+++ b/requirements/edx/github.in
@@ -74,7 +74,3 @@ git+https://github.com/edx/django-ratelimit-backend.git@v2.0.1a5#egg=django-rate
 
 git+https://github.com/open-craft/xblock-poll@1efd04bd6e16252a20e39a7516f9b69a000ace24#egg=xblock-poll==1.10.0
 git+https://github.com/edx-solutions/xblock-drag-and-drop-v2@v2.2.10#egg=xblock-drag-and-drop-v2==2.2.10
-
-
-# Test new version of edx-search
-git+https://github.com/raccoongang/edx-search.git@golub-sergey/BD-19/transition-from-ES1.5-to-ES7
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index c7bcc62f74d..4fad329c082 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -35,7 +35,7 @@ boto==2.39.0              # via -r requirements/edx/base.txt, edxval
 botocore==1.8.17          # via -r requirements/edx/base.txt, boto3, s3transfer
 bridgekeeper==0.9         # via -r requirements/edx/base.txt
 celery==4.4.7             # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, django-celery-results, django-user-tasks, edx-celeryutils, edx-enterprise, event-tracking
-certifi==2020.6.20        # via -r requirements/edx/base.txt, elasticsearch, requests
+certifi==2020.6.20        # via -r requirements/edx/base.txt, requests
 cffi==1.14.3              # via -r requirements/edx/base.txt, cryptography
 chardet==3.0.4            # via -r requirements/edx/base.txt, pysrt, requests
 chem==1.2.0               # via -r requirements/edx/base.txt
@@ -116,14 +116,14 @@ edx-proctoring-proctortrack==1.0.5  # via -r requirements/edx/base.txt
 edx-proctoring==2.4.8     # via -r requirements/edx/base.txt, edx-proctoring-proctortrack
 edx-rbac==1.3.3           # via -r requirements/edx/base.txt, edx-enterprise
 edx-rest-api-client==5.2.1  # via -r requirements/edx/base.txt, edx-enterprise, edx-proctoring
-git+https://github.com/raccoongang/edx-search.git@golub-sergey/BD-19/transition-from-ES1.5-to-ES7  # via -r requirements/edx/base.txt
+edx-search==1.4.1         # via -r requirements/edx/base.txt
 edx-sga==0.11.1           # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt
 edx-submissions==3.2.2    # via -r requirements/edx/base.txt, ora2
 edx-tincan-py35==0.0.9    # via -r requirements/edx/base.txt, edx-enterprise
 edx-user-state-client==1.2.0  # via -r requirements/edx/base.txt
 edx-when==1.3.0           # via -r requirements/edx/base.txt, edx-proctoring
 edxval==1.4.2             # via -r requirements/edx/base.txt
-elasticsearch==7.9.1      # via -r requirements/edx/base.txt, edx-search
+elasticsearch==1.9.0      # via -r requirements/edx/base.txt, edx-search
 enmerkar-underscore==1.0.0  # via -r requirements/edx/base.txt
 enmerkar==0.7.1           # via -r requirements/edx/base.txt, enmerkar-underscore
 event-tracking==1.0.0     # via -r requirements/edx/base.txt, edx-proctoring, edx-search
-- 
GitLab