全文搜索引擎Elasticsearch的初體驗:基本概念和操作

一、簡介

關於Java Web的開發周邊技術,搜索引擎也是經常被用到的,其中solr和es是被當作技術選型經常出現的,他們都是基於lucene,但是,你沒法直接用 Lucene,必須自己寫代碼去調用它的接口。而今天所講的es,它是一個分佈式、RESTful 風格的搜索和數據分析引擎,能夠解決不斷湧現出的各種用例。

一、簡介

關於Java Web的開發周邊技術,搜索引擎也是經常被用到的,其中solr和es是被當作技術選型經常出現的,他們都是基於lucene,但是,你沒法直接用 Lucene,必須自己寫代碼去調用它的接口。而今天所講的es,它是一個分佈式、RESTful 風格的搜索和數據分析引擎,能夠解決不斷湧現出的各種用例。

解壓剛纔下載的壓縮包,然後進入bin目錄,可以看到一些es的相關命令:

使用bin目錄中的elasticsearch命令啓動:

它會啓動在9200端口,這是我們可以訪問一下http://127.0.0.1:9200/:

看它的tagline:ou Know, for Search。證明啓動成功了,可以開始我們的搜索了。

三:概念

在使用es之前,先來了解一些它的基本概念:

1、Node:單個 Elastic 實例稱爲一個節點(node)

2、Cluster:一組節點構成一個集羣(cluster),Elastic 本質上是一個分佈式數據庫,允許多臺服務器協同工作,每臺服務器可以運行多個 Elastic 實例。

3、Index:Elastic 數據管理的頂層單位就叫做 Index(索引),Elastic 會索引所有字段,經過處理後寫入一個反向索引(Inverted Index)。查找數據的時候,直接查找該索引。

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

5、Type:Document 可以分組,這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。

四:中文分詞

在搜索引擎中,還有一個重要的設置,那就是中文分詞的設置,畢竟國內開發不得不安裝這個插件,就像編碼處理一樣,剛纔在bin目錄中大家也看到一個命令:elasticsearch-plugin,我們可以利用它來安裝中文分詞神器-ik中文分詞器,安裝命令如下:

/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip

接着,重新啓動 Elastic,就會自動加載這個新安裝的插件。

五:數據的操作

1、新建Index,指定需要分詞的字段:

命令
curl -X PUT 'localhost:9200/cities' -d '
{
  "mappings": {
    "city": {
      "properties": {
        "name": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        },
        "desc": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        }
      }
    }
  }
}'

上述操作新建一個名稱爲cities的 Index,裏面有一個名稱爲city的 Type。person有兩個屬性:name和desc。analyzer是字段文本的分詞器,search_analyzer是搜索詞的分詞器。ik_max_word分詞器是插件ik提供的,可以對文本進行最大數量的分詞。{"acknowledged":true,"shards_acknowledged":true}是服務器返回的JSON值,acknowledged=true表示操作成功。

2、新增記錄

向指定的 /Index/Type 發送 PUT 請求,就可以在 Index 裏面新增一條記錄。

命令
curl -X PUT 'localhost:9200/cities/city/1' -d '
{
  "name": "北京",
  "desc": "帝都,北漂的人想出去,外邊的人想北漂。"
}'

如圖所示,服務器返回的 JSON 對象,會給出 Index、Type、Id、Version 等信息。

在請求的路徑中,最後的1是該條記錄的 Id,它不一定是數字,任意字符串都可以。新增記錄的時候,也可以不指定 Id,這時要改成 POST 請求。

命令:
curl -X POST 'localhost:9200/cities/city' -d '
{
  "name": "上海",
  "desc": "上海灘,多少人想成爲許文強一樣的人物"
}'

3、查看記錄

向/Index/Type/Id發出 GET 請求,就可以查看這條記錄。

命令
curl 'localhost:9200/cities/city/1?pretty=true'

4、刪除記錄

刪除記錄就是發出 DELETE 請求。

命令
curl -X DELETE 'localhost:9200/cities/city/1'

5、更新記錄

更新記錄就是使用 PUT 請求,重新發送一次數據。

命令:
curl -X PUT 'localhost:9200/cities/city/AXKyTASFQrU13vhMO-rj' -d '
{
  "name": "上海",
  "desc": "上海灘,多少人想成爲許文強一樣的人物,還需要丁力一樣的幫手"
}'

6、返回所有記錄

使用 GET 方法,直接請求/Index/Type/_search,就會返回所有記錄。我們把剛纔刪除的北京添加進來,再查詢:

命令
curl 'localhost:9200/cities/city/_search'

7、全文搜索

Elastic 有自己的查詢語法,要求 GET 請求帶有數據體。

命令:
curl 'localhost:9200/cities/city/_search'  -d '
{
  "query" : { "match" : { "desc" : "北漂" }}
}'

上面是查詢語法,下面是查詢結果。

8、邏輯運算

如果有多個搜索關鍵字, Elastic 認爲它們是or關係。

命令:
curl 'localhost:9200/cities/city/_search'  -d '
{
  "query" : { "match" : { "desc" : "北漂 許文強" }}
}'

如果要執行多個關鍵詞的and搜索,必須使用布爾查詢。

命令:
curl 'localhost:9200/cities/city/_search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "北漂" } },
        { "match": { "desc": "許文強" } }
      ]
    }
  }
}'

沒有結果返回。

elasticsearch在日常開發中用途很多,感興趣可以動手試一試,瞭解一下它都有什麼功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章