diff --git a/elasticsearch_dsl/index.py b/elasticsearch_dsl/index.py
index 3d6af0e..9237377 100644
--- a/elasticsearch_dsl/index.py
+++ b/elasticsearch_dsl/index.py
@@ -31,7 +31,8 @@ class Index(object):
         :arg using: connection alias to use, defaults to ``'default'``
         """
         i = Index(name, using=using or self._using)
-        for attr in ('_doc_types', '_mappings', '_settings', '_aliases'):
+        for attr in ('_doc_types', '_mappings', '_settings', '_aliases',
+                     '_analysis'):
             setattr(i, attr, getattr(self, attr).copy())
         return i
 
diff --git a/setup.py b/setup.py
index 661276a..bdf9a33 100644
--- a/setup.py
+++ b/setup.py
@@ -60,4 +60,6 @@ setup(
 
     test_suite = "test_elasticsearch_dsl.run_tests.run_all",
     tests_require=tests_require,
+
+    extras_require={'develop': tests_require},
 )

Index.clone() does not copy Index._analysis
I am not sure if it's intended or not but `Index.clone()` does not copy `_analysis` attribute.
diff --git a/test_elasticsearch_dsl/test_index.py b/test_elasticsearch_dsl/test_index.py
index d2faaad..17aa6b7 100644
--- a/test_elasticsearch_dsl/test_index.py
+++ b/test_elasticsearch_dsl/test_index.py
@@ -27,6 +27,24 @@ def test_cloned_index_has_copied_settings_and_using():
     assert i._settings == i2._settings
     assert i._settings is not i2._settings
 
+def test_cloned_index_has_analysis_attribute():
+    """
+    Regression test for Issue #582 in which `Index.clone()` was not copying
+    over the `_analysis` attribute.
+    """
+    client = object()
+    i = Index('my-index', using=client)
+
+    random_analyzer_name = ''.join((choice(string.ascii_letters) for _ in range(100)))
+    random_analyzer = analyzer(random_analyzer_name, tokenizer="standard", filter="standard")
+
+    i.analyzer(random_analyzer)
+
+    i2 = i.clone('my-clone-index')
+
+    assert i.to_dict()['settings']['analysis'] == i2.to_dict()['settings']['analysis']
+
+
 def test_settings_are_saved():
     i = Index('i')
     i.settings(number_of_replicas=0)

pip install -e '.[develop]'
parse_log_pytest
requirements.txt
mock pytz pytest
apt-get update apt-get install -y gcc
3.5
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
elasticsearch==5.5.3
-e git+https://github.com/elastic/elasticsearch-dsl-py.git@d291eb55ef01f6bfa02835dcfd90276d5cd8871e#egg=elasticsearch_dsl
importlib-metadata==4.8.3
iniconfig==1.1.1
mock==5.2.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: elasticsearch-dsl-py
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - elasticsearch==5.5.3
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - mock==5.2.0
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/elasticsearch-dsl-py

test_elasticsearch_dsl/test_index.py::test_cloned_index_has_analysis_attribute
test_elasticsearch_dsl/test_index.py::test_search_is_limited_to_index_name test_elasticsearch_dsl/test_index.py::test_cloned_index_has_copied_settings_and_using test_elasticsearch_dsl/test_index.py::test_settings_are_saved test_elasticsearch_dsl/test_index.py::test_registered_doc_type_included_in_to_dict test_elasticsearch_dsl/test_index.py::test_registered_doc_type_included_in_search test_elasticsearch_dsl/test_index.py::test_aliases_add_to_object test_elasticsearch_dsl/test_index.py::test_aliases_returned_from_to_dict test_elasticsearch_dsl/test_index.py::test_analyzers_added_to_object test_elasticsearch_dsl/test_index.py::test_analyzers_returned_from_to_dict
elasticsearch_dsl/index.py setup.py
elasticsearch_dsl/index.py setup.py