如何在python中使用Elasticsearch

什麼是 Elasticsearch

​ 想查數據就免不了搜索,搜索就離不開搜索引擎,百度、谷歌都是一個非常龐大複雜的搜索引擎,他們幾乎索引了互聯網上開放的所有網頁和數據。然而對於我們自己的業務數據來說,肯定就沒必要用這麼複雜的技術了,如果我們想實現自己的搜索引擎,方便存儲和檢索,Elasticsearch 就是不二選擇,它是一個全文搜索引擎,可以快速地儲存、搜索和分析海量數據。

爲什麼要用 Elasticsearch

​ Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene™ 基礎之上。

那 Lucene 又是什麼?Lucene 可能是目前存在的,不論開源還是私有的,擁有最先進,高性能和全功能搜索引擎功能的庫,但也僅僅只是一個庫。要用上 Lucene,我們需要編寫 Java 並引用 Lucene 包纔可以,而且我們需要對信息檢索有一定程度的理解才能明白 Lucene 是怎麼工作的,反正用起來沒那麼簡單。

那麼爲了解決這個問題,Elasticsearch 就誕生了。Elasticsearch 也是使用 Java 編寫的,它的內部使用 Lucene 做索引與搜索,但是它的目標是使全文檢索變得簡單,相當於 Lucene 的一層封裝,它提供了一套簡單一致的 RESTful API 來幫助我們實現存儲和檢索。

所以 Elasticsearch 僅僅就是一個簡易版的 Lucene 封裝嗎?那就大錯特錯了,Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜索引擎。 它可以被下面這樣準確的形容:

  • 一個分佈式的實時文檔存儲,每個字段可以被索引與搜索
  • 一個分佈式實時分析搜索引擎
  • 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據

總之,是一個相當牛逼的搜索引擎,維基百科、Stack Overflow、GitHub 都紛紛採用它來做搜索。

Elasticsearch 的安裝

​ 我們可以到 Elasticsearch 的官方網站下載 Elasticsearch:https://www.elastic.co/downloads/elasticsearch,同時官網也附有安裝說明。此次我們選用elasticsearch5.6.15版本,選用最新版本也可以,首先把安裝包下載下來並解壓,然後運行 bin/elasticsearch(Mac 或 Linux)或者 bin\elasticsearch.bat (Windows) 即可啓動 Elasticsearch 了。

但是Elasticsearch是由Java編寫的軟件,要想運行它還得在操作系統中安裝Java環境及JRE和JDK。下面就介紹如何在Linux(此次用Ubuntu18.04作爲操作系統)安裝Java環境。

Java環境的安裝

  • 安裝Java的最簡單方法是使用與Ubuntu一起打包的版本。 默認情況下,Ubuntu 18.04包含Open JDK,它是JRE和JDK的開源版本。

  • 該軟件包將安裝OpenJDK 10或11。

    • 在2018年9月之前,這將安裝OpenJDK 10。
    • 2018年9月以後,這將安裝OpenJDK 11。

    要安裝此版本,請先更新軟件包索引:

      sudo apt update

    接下來,檢查Java是否已經安裝:

      java -version

    如果Java當前未安裝,您將看到以下輸出:

        Command 'java' not found, but can be installed with:
    
        apt install default-jre
        apt install openjdk-11-jre-headless
        apt install openjdk-8-jre-headless
        apt install openjdk-9-jre-headless

    執行以下命令來安裝OpenJDK:

      sudo apt install default-jre

    該命令將安裝Java運行時環境(JRE)。 這將允許您運行幾乎所有的Java軟件。

    驗證安裝:

      java -version

    您將看到以下輸出:

        Outputopenjdk version "10.0.1" 2018-04-17
        OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
        OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

    除了JRE之外,您可能還需要Java開發工具包(JDK)才能編譯和運行一些特定的基於Java的軟件。 要安裝JDK,請執行以下命令,該命令也將安裝JRE:

      sudo apt install default-jdk

    通過檢查Java編譯器javac的版本來驗證是否安裝了JDK:

      javac -version

    您將看到以下輸出:

    javac 10.0.1

設置JAVA_HOME環境變量

​ 許多使用Java編寫的程序使用JAVA_HOME環境變量來確定Java安裝位置。要設置此環境變量,請先確定Java的安裝位置。 使用update-alternatives命令:

    sudo update-alternatives --config java

​ 該命令顯示Java的每個安裝及其安裝路徑,由於此操作系統只安裝了一個Java版本故呈現如下提示:

    There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java Nothing to configure.

​ 複製你安裝Java的路徑。 然後用vim文本編輯器打開/etc/environment

vim /etc/environment

​ 在該文件的末尾,添加以下行,確保使用自己的複製路徑替換突出顯示的路徑:

​ JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin/java"

​ 修改此文件將爲系統上的所有用戶設置JAVA_HOME路徑。

​ 保存文件並退出編輯器。

​ 現在重新加載此文件以將更改應用於當前會話:

    source /etc/environment

​ 驗證是否設置了環境變量:

    echo $JAVA_HOME

​ 你會看到你剛剛設置的路徑:

    /usr/lib/jvm/java-11-openjdk-amd64/bin/java

​ 其他用戶將需要執行命令source /etc/environment或註銷並重新登錄以應用此設置。

啓動Elasticsearch

​ 進入解壓後的Elasticsearch目錄後,執行

    bin/elasticsearch -d

Elasticsearch 默認會在 9200 端口上運行,我們打開瀏覽器訪問
http://localhost:9200/ 就可以看到類似內容:

{"name": "u2cfkGI",
 "cluster_name": "elasticsearch", 
 "cluster_uuid": "uj0P2qPCQOKUfd8Zt7hzEQ",
 "version": {"number": "5.6.15", "build_hash": "fe7575a", "build_date": "2019-02-13T16:21:45.880Z", "build_snapshot": false, "lucene_version": "6.6.1"}, 
 "tagline": "You Know, for Search"
}

如果看到這個內容,就說明 Elasticsearch 安裝並啓動成功了,這裏顯示我的 Elasticsearch 版本是 5.6.15 版本,版本很重要,以後安裝一些插件都要做到版本對應纔可以。

接下來我們來了解一下 Elasticsearch 的基本概念以及和 Python 的對接。

Elasticsearch 相關概念

在 Elasticsearch 中有幾個基本的概念,如節點、索引、文檔等等,下面來分別說明一下,理解了這些概念對熟悉 Elasticsearch 是非常有幫助的。

Node 和 Cluster

Elasticsearch 本質上是一個分佈式數據庫,允許多臺服務器協同工作,每臺服務器可以運行多個 Elasticsearch 實例。

單個 Elasticsearch 實例稱爲一個節點(Node)。一組節點構成一個集羣(Cluster)。

Index

Elasticsearch 會索引所有字段,經過處理後寫入一個反向索引(Inverted Index)。查找數據的時候,直接查找該索引。

所以,Elasticsearch 數據管理的頂層單位就叫做 Index(索引),其實就相當於 MySQL、MongoDB 等裏面的數據庫的概念。另外值得注意的是,每個 Index (即數據庫)的名字必須是小寫。

Document

Index 裏面單條的記錄稱爲 Document(文檔)。許多條 Document 構成了一個 Index。

Document 使用 JSON 格式表示,下面是一個例子。

同一個 Index 裏面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利於提高搜索效率。

Type

Document 可以分組,比如 weather 這個 Index 裏面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document,類似 MySQL 中的數據表,MongoDB 中的 Collection。

不同的 Type 應該有相似的結構(Schema),舉例來說,id 字段不能在這個組是字符串,在另一個組是數值。這是與關係型數據庫的表的一個區別。性質完全不同的數據(比如 products 和 logs)應該存成兩個 Index,而不是一個 Index 裏面的兩個 Type(雖然可以做到)。

根據規劃,Elastic 6.x 版只允許每個 Index 包含一個 Type,7.x 版將會徹底移除 Type。

Fields

即字段,每個 Document 都類似一個 JSON 結構,它包含了許多字段,每個字段都有其對應的值,多個字段組成了一個 Document,其實就可以類比 MySQL 數據表中的字段。

在 Elasticsearch 中,文檔歸屬於一種類型(Type),而這些類型存在於索引(Index)中,我們可以畫一些簡單的對比圖來類比傳統關係型數據庫:

  • Relational DB -> Databases -> Tables -> Rows ->Columns == Elasticsearch -> Indices -> Types -> Documents -> Fields

以上就是 Elasticsearch 裏面的一些基本概念,通過和關係性數據庫的對比更加有助於理解。

Python 對接 Elasticsearch

Elasticsearch 實際上提供了一系列 Restful API 來進行存取和查詢操作,我們可以使用 curl 等命令來進行操作,但畢竟命令行模式沒那麼方便,所以這裏我們就直接介紹利用 Python 來對接 Elasticsearch 的相關方法。

Python 中對接 Elasticsearch 使用的就是一個同名的庫,安裝方式非常簡單:

    pip3 install elasticsearch

官方文檔是:https://elasticsearch-py.readthedocs.io/,所有的用法都可以在裏面查到,文章後面的內容也是基於官方文檔來的。

創建 Index

我們先來看下怎樣創建一個索引(Index),這裏我們創建一個名爲 news 的索引:

from elasticsearch import Elasticsearch
 
es = Elasticsearch()
result = es.indices.create(index='news', ignore=400)
print(result)

如果創建成功,會返回如下結果:

{'acknowledged': True, 'shards_acknowledged': True, 'index': 'news'}

返回結果是 JSON 格式,其中的 acknowledged 字段表示創建操作執行成功。

但這時如果我們再把代碼執行一次的話,就會返回如下結果:

{'error': {'root_cause': [{'type': 'resource_already_exists_exception', 'reason': 'index [news/QM6yz2W8QE-bflKhc5oThw] already exists', 'index_uuid': 'QM6yz2W8QE-bflKhc5oThw', 'index': 'news'}], 'type': 'resource_already_exists_exception', 'reason': 'index [news/QM6yz2W8QE-bflKhc5oThw] already exists', 'index_uuid': 'QM6yz2W8QE-bflKhc5oThw', 'index': 'news'}, 'status': 400}

它提示創建失敗,status 狀態碼是 400,錯誤原因是 Index 已經存在了。注意這裏我們的代碼裏面使用了 ignore 參數爲 400,這說明如果返回結果是 400 的話,就忽略這個錯誤不會報錯,程序不會執行拋出異常。

假如我們不加 ignore 這個參數的話:

es = Elasticsearch()
result = es.indices.create(index='news')
print(result)

再次執行就會報錯了:

raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, 'resource_already_exists_exception', 'index [news/QM6yz2W8QE-bflKhc5oThw] already exists')

這樣程序的執行就會出現問題,所以說,我們需要善用 ignore 參數,把一些意外情況排除,這樣可以保證程序的正常執行而不會中斷。

刪除 Index

刪除 Index 也是類似的,代碼如下:

from elasticsearch import Elasticsearch

es = Elasticsearch()
result = es.indices.delete(index='news', ignore=[400, 404])
print(result)

這裏也是使用了 ignore 參數,來忽略 Index 不存在而刪除失敗導致程序中斷的問題。

如果刪除成功,會輸出如下結果:

    {'acknowledged': True}

如果 Index 已經被刪除,再執行刪除則會輸出如下結果:

{'error': {'root_cause': [{'type': 'index_not_found_exception', 'reason': 'no such index', 'resource.type': 'index_or_alias', 'resource.id': 'news', 'index_uuid': '_na_', 'index': 'news'}], 'type': 'index_not_found_exception', 'reason': 'no such index', 'resource.type': 'index_or_alias', 'resource.id': 'news', 'index_uuid': '_na_', 'index': 'news'}, 'status': 404}

這個結果表明當前 Index 不存在,刪除失敗,返回的結果同樣是 JSON,狀態碼是 400,但是由於我們添加了 ignore 參數,忽略了 400 狀態碼,因此程序正常執行輸出 JSON 結果,而不是拋出異常。

插入數據

Elasticsearch 就像 MongoDB 一樣,在插入數據的時候可以直接插入結構化字典數據,插入數據可以調用 create() 方法,例如這裏我們插入一條新聞數據:

from elasticsearch import Elasticsearch

es = Elasticsearch()
es.indices.create(index='news', ignore=400)

data = {'title': '美國留給伊拉克的是個爛攤子嗎', 'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm'}
result = es.create(index='news', doc_type='politics', id=1, body=data)
print(result)

這裏我們首先聲明瞭一條新聞數據,包括標題和鏈接,然後通過調用 create() 方法插入了這條數據,在調用 create() 方法時,我們傳入了四個參數,index 參數代表了索引名稱,doc_type 代表了文檔類型,body 則代表了文檔具體內容,id 則是數據的唯一標識 ID。運行結果如下:

{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}

結果中 result 字段爲 created,代表該數據插入成功。

另外其實我們也可以使用 index() 方法來插入數據,但與 create() 不同的是,create() 方法需要我們指定 id 字段來唯一標識該條數據,而 index() 方法則不需要,如果不指定 id,會自動生成一個 id,調用 index() 方法的寫法如下:

es.index(index='news', doc_type='politics', body=data)

create() 方法內部其實也是調用了 index() 方法,是對 index() 方法的封裝。

更新數據

更新數據也非常簡單,我們同樣需要指定數據的 id 和內容,調用 update() 方法即可,代碼如下:

from elasticsearch import Elasticsearch

es = Elasticsearch()
data = {
    'title': '美國留給伊拉克的是個爛攤子嗎',
    'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm',
    'date': '2011-12-16'
}
result = es.update(index='news', doc_type='politics', body=data, id=1)
print(result)

這裏我們爲數據增加了一個日期字段,然後調用了 update() 方法,結果如下:

{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 2, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 1, '_primary_term': 1}
可以看到返回結果中,result 字段爲 updated,即表示更新成功,另外我們還注意到有一個字段 _version,這代表更新後的版本號數,2 代表這是第二個版本,因爲之前已經插入過一次數據,所以第一次插入的數據是版本 1,可以參見上例的運行結果,這次更新之後版本號就變成了 2,以後每更新一次,版本號都會加 1。
另外更新操作其實利用 index() 方法同樣可以做到,寫法如下:
es.index(index='news', doc_type='politics', body=data, id=1)

可以看到,index() 方法可以代替我們完成兩個操作,如果數據不存在,那就執行插入操作,如果已經存在,那就執行更新操作,非常方便。

刪除數據

如果想刪除一條數據可以調用 delete() 方法,指定需要刪除的數據 id 即可,寫法如下:

from elasticsearch import Elasticsearch

es = Elasticsearch()
result = es.delete(index='news', doc_type='politics', id=1)
print(result)

運行結果如下:

{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 3, 'result': 'deleted', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 2, '_primary_term': 1}

可以看到運行結果中 result 字段爲 deleted,代表刪除成功,_version 變成了 3,又增加了 1。

查詢數據

上面的幾個操作都是非常簡單的操作,普通的數據庫如 MongoDB 都是可以完成的,看起來並沒有什麼了不起的,Elasticsearch 更特殊的地方在於其異常強大的檢索功能。

對於中文來說,我們需要安裝一個分詞插件,這裏使用的是 elasticsearch-analysis-ik,GitHub 鏈接爲:https://github.com/medcl/elasticsearch-analysis-ik,這裏我們使用 Elasticsearch 的另一個命令行工具 elasticsearch-plugin 來安裝,這裏安裝的版本是 5.6.15,請確保和 Elasticsearch 的版本對應起來,命令如下:

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.15/elasticsearch-analysis-ik-5.6.15.zip

這裏的版本號請替換成你的 Elasticsearch 的版本號。

安裝之後重新啓動 Elasticsearch 就可以了,它會自動加載安裝好的插件。

首先我們新建一個索引並指定需要分詞的字段,代碼如下:

from elasticsearch import Elasticsearch

es = Elasticsearch()
mapping = {
    'properties': {
        'title': {
            'type': 'text',
            'analyzer': 'ik_max_word',
            'search_analyzer': 'ik_max_word'
        }
    }
}
es.indices.delete(index='news', ignore=[400, 404])
es.indices.create(index='news', ignore=400)
result = es.indices.put_mapping(index='news', doc_type='politics', body=mapping)
print(result)

這裏我們先將之前的索引刪除了,然後新建了一個索引,然後更新了它的 mapping 信息,mapping 信息中指定了分詞的字段,指定了字段的類型 type 爲 text,分詞器 analyzer 和 搜索分詞器 search_analyzer 爲 ik_max_word,即使用我們剛纔安裝的中文分詞插件。如果不指定的話則使用默認的英文分詞器。

接下來我們插入幾條新的數據:

datas = [
    {
        'title': '美國留給伊拉克的是個爛攤子嗎',
        'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm',
        'date': '2011-12-16'
    },
    {
        'title': '公安部:各地校車將享最高路權',
        'url': 'http://www.chinanews.com/gn/2011/12-16/3536077.shtml',
        'date': '2011-12-16'
    },
    {
        'title': '中韓漁警衝突調查:韓警平均每天扣1艘中國漁船',
        'url': 'https://news.qq.com/a/20111216/001044.htm',
        'date': '2011-12-17'
    },
    {
        'title': '中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首',
        'url': 'http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml',
        'date': '2011-12-18'
    }
]

for data in datas:
    es.index(index='news', doc_type='politics', body=data)

這裏我們指定了四條數據,都帶有 title、url、date 字段,然後通過 index() 方法將其插入 Elasticsearch 中,索引名稱爲 news,類型爲 politics。接下來我們根據關鍵詞查詢一下相關內容:

result = es.search(index='news', doc_type='politics')
print(result)

可以看到查詢出了所有插入的四條數據:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "news",
        "_type": "politics",
        "_id": "c05G9mQBD9BuE5fdHOUT",
        "_score": 1.0,
        "_source": {
          "title": "美國留給伊拉克的是個爛攤子嗎",
          "url": "http://view.news.qq.com/zt2011/usa_iraq/index.htm",
          "date": "2011-12-16"
        }
      },
      {
        "_index": "news",
        "_type": "politics",
        "_id": "dk5G9mQBD9BuE5fdHOUm",
        "_score": 1.0,
        "_source": {
          "title": "中國駐洛杉磯領事館遭亞裔男子槍擊,嫌犯已自首",
          "url": "http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml",
          "date": "2011-12-18"
        }
      },
      {
        "_index": "news",
        "_type": "politics",
        "_id": "dU5G9mQBD9BuE5fdHOUj",
        "_score": 1.0,
        "_source": {
          "title": "中韓漁警衝突調查:韓警平均每天扣1艘中國漁船",
          "url": "https://news.qq.com/a/20111216/001044.htm",
          "date": "2011-12-17"
        }
      },
      {
        "_index": "news",
        "_type": "politics",
        "_id": "dE5G9mQBD9BuE5fdHOUf",
        "_score": 1.0,
        "_source": {
          "title": "公安部:各地校車將享最高路權",
          "url": "http://www.chinanews.com/gn/2011/12-16/3536077.shtml",
          "date": "2011-12-16"
        }
      }
    ]
  }
}
可以看到返回結果會出現在 hits 字段裏面,然後其中有 total 字段標明瞭查詢的結果條目數,還有 max_score 代表了最大匹配分數。

另外我們還可以進行全文檢索,這纔是體現 Elasticsearch 搜索引擎特性的地方:
dsl = {
    'query': {
        'match': {
            'title': '中國 領事館'
        }
    }
}

es = Elasticsearch()
result = es.search(index='news', doc_type='politics', body=dsl)
print(json.dumps(result, indent=2, ensure_ascii=False))

這裏我們使用 Elasticsearch 支持的 DSL 語句來進行查詢,使用 match 指定全文檢索,檢索的字段是 title,內容是“中國領事館”,搜索結果如下:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.546152,
    "hits": [
      {
        "_index": "news",
        "_type": "politics",
        "_id": "dk5G9mQBD9BuE5fdHOUm",
        "_score": 2.546152,
        "_source": {
          "title": "中國駐洛杉磯領事館遭亞裔男子槍擊,嫌犯已自首",
          "url": "http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml",
          "date": "2011-12-18"
        }
      },
      {
        "_index": "news",
        "_type": "politics",
        "_id": "dU5G9mQBD9BuE5fdHOUj",
        "_score": 0.2876821,
        "_source": {
          "title": "中韓漁警衝突調查:韓警平均每天扣1艘中國漁船",
          "url": "https://news.qq.com/a/20111216/001044.htm",
          "date": "2011-12-17"
        }
      }
    ]
  }
}
這裏我們看到匹配的結果有兩條,第一條的分數爲 2.54,第二條的分數爲 0.28,這是因爲第一條匹配的數據中含有“中國”和“領事館”兩個詞,第二條匹配的數據中不包含“領事館”,但是包含了“中國”這個詞,所以也被檢索出來了,但是分數比較低。

因此可以看出,檢索時會對對應的字段全文檢索,結果還會按照檢索關鍵詞的相關性進行排序,這就是一個基本的搜索引擎雛形。

另外 Elasticsearch 還支持非常多的查詢方式,詳情可以參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl.html

以上便是對 Elasticsearch 的基本介紹以及 Python 操作 Elasticsearch 的基本用法,但這僅僅是 Elasticsearch 的基本功能,它還有更多強大的功能等待着我們的探索,後面會繼續更新,敬請期待。

以上可能會出現的報錯及解決辦法

  • Elasticsearch無法以root用戶啓動

    解決辦法:新建普通用戶,把elasticsearch 所在的文件夾擁有者,擁有組都修改爲此用戶,然後切換至此用戶來啓動

    命令如下:chown -R zepc:zepc elasticsearch-5.6.15

    然後再重新啓動程序,就可以啓動成功

  • 安裝分詞插件elasticsearch-analysis-ik失敗

    解決辦法:手動進行安裝

    apt-get install wget
    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.15/elasticsearch-analysis-ik-5.6.15.zip
    apt-get install unzip
    unzip elasticsearch-analysis-ik-5.6.15.zip
    mkdir elasticsearch-5.6.15/plugins/ik
    mv elasticsearch-analysis-ik-5.6.15/* elasticsearch-5.6.15/plugins/ik

    安裝完成後,重新啓動Elasticsearch,界面就會提示插件加載成功

  • 外部用戶無法訪問

    解決辦法:修改配置文件

    打開Elasticsearch的配置文件

    elasticsearch-5.6.15/conf/elasticsearch.yml
    將network.host解注並將其設置爲network.host: '0.0.0.0'
    保存退出,重啓後既可以進行外部訪問了
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章