從零到壹搭建一個商城架構--Elasticsearch進階檢索

1、SearchAPI

ES支持兩種基本方式檢索:

  • 一個是通過使用 REST request URI 發送搜索參數(uri+檢索參數)

    GET bank/_search?q=*&sort=account_number:asc

  • 另一個是通過使用 REST request body 來發送它們(uri+請求體)

  GET bank/_search
  {
    "query": {
      "match_all": {}
    }
    , "sort": [
      {
        "account_number": {
          "order": "asc"
        }
      }
    ]
  }

以上內容只是一個簡單的應用,具體的需要查看官方文檔


以下內容只是列出了一些核心功能,沒有語法說明

2、Query DSL

ElasticSearch提供了一個可以執行查詢的json風格的DSL(domain-specific language 領域特定語言)。這個被稱爲Qquery DSL。該語言非常全面,並且剛開始的時候感覺有點複雜,真正學好它的方法是從一些基礎的是示例開始的。

3、aggregations(執行聚合)

聚合提供了從數據中心分組和提取數據的能力。最簡單的聚合方法大致等於SQL GROUP BY和SQL聚合函數。在ElasticSearch中,有執行搜索返回hits(命中結果),並且同事返回聚合結果,把一個響應中的所有hits(命中結果)分隔開的能力。這是非常強大且有效的,可以執行查詢和多個聚合,並且在一次使用中得到各自的(任何一個的)返回結果,使用一次簡潔和簡化的API來避免網絡往返。

4、Mapping

映射,我們可以自定義屬性的類型,數據遷移等操作,支持的數據類型如下

在這裏插入圖片描述

5、分詞

一個tokenizer(分詞器)接收一個字符流,將之分隔爲獨立的tokens(詞元,通常是獨立的單詞),然後輸出tokens流。

例如,whitespace tokenizer遇到空白字符時分隔文本,它會將文本“Quick brown fox!” 分隔爲[Quick,brown,fox!]。

該tokenizer(分詞器)還負責記錄各個term(詞條)的順序或position位置(用於phrase短語和word proximity詞近鄰查詢),以及term(詞條)鎖代表的原始word(單詞)的start(起始)和end(結束)的character offsets(字符偏移量)(用於高亮顯示搜索的內容)。

ElasticSearch提供了很多內置的分詞器,可以用來構建custom analyzers(自定義分詞器)

使用ES內置的分詞器執行

POST _analyze
{
  "analyzer": "standard",
  "text": "我是中國人"
}

效果如下

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "中",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "國",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "人",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}

它會把每一個漢字都轉換成一個詞,因爲內置的只支持英文單詞的分詞,所以我們下載支持中文的分詞器

  • 安裝ik分詞器

    注意:不能用默認elasticsearch-plugin install xxx.zip 進行自動安裝

    我們打開github,找到對應版本的分詞器,網址如下

    https://github.com/medcl/elasticsearch-analysis-ik/releases

    找到我們對應的版本號 7.4.2進行下載

    解壓到我們安裝ES的plugins文件中,切換到/mydata/elasticsearch/plugins目錄

    #創建一個目錄,存放下載來的分詞器文件
    mkdir elasticsearch-analysis-ik
    #解壓zip文件到 elasticsearch-analysis-ik 目錄
    unzip elasticsearch-analysis-ik-7.4.2.zip -d elasticsearch-analysis-ik
    # 重啓elasticsearch
    docker restart elasticsearch
    
  • 在kibana中進行測試

    POST _analyze
    {
      "analyzer": "ik_max_word",
      "text": "我是中國人"
    }
    

    結果如下

    {
      "tokens" : [
        {
          "token" : "我",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "CN_CHAR",
          "position" : 0
        },
        {
          "token" : "是",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "CN_CHAR",
          "position" : 1
        },
        {
          "token" : "中國人",
          "start_offset" : 2,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 2
        },
        {
          "token" : "中國",
          "start_offset" : 2,
          "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 3
        },
        {
          "token" : "國人",
          "start_offset" : 3,
          "end_offset" : 5,
          "type" : "CN_WORD",
          "position" : 4
        }
      ]
    }
    
    

    這個效果也不是太好,沒有按照我們想要的分詞來進行分詞,所以我們可以自定義分詞器

  • 自定義詞庫

  • 首先我們把ES的內存調整的大一點

#先停止ES
  docker stop elasticsearch
#移除ES
  docker rm elasticsearch

  
  #然後執行以下命令
  
  docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
  -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  -d elasticsearch:7.4.2
  • 接着安裝nginx

    • 隨便啓動一個nginx實例,只是爲了複製出配置文件

    #創建nginx文件夾
    cd /mydata
    mkdir nginx
    #創建nginx鏡像
    docker run -p 80:80 --name nginx -d nginx:1.10

    
    - 將容器內的配置文件拷貝到/mydata的目錄
    
    ```shell
    #需要注意後面的.
    docker container cp nginx:/etc/nginx .
    
    • 修改文件名稱

      #把nginx文件夾修改爲conf文件夾
      mv nginx conf
      #然後重新創建一個nginx文件夾
      mkdir nginx
      #把conf文件夾移動到nginx文件夾下
      mv conf nginx/
      
    • 終止原容器

      docker stop nginx
      
    • 執行命令刪除原容器

      docker rm nginx
      
    • 創建新的nginx,執行以下命令

      docker run -p 80:80 --name nginx \
      -v /mydata/nginx/html:/usr/share/nginx/html \
      -v /mydata/nginx/logs:/var/log/nginx \
      -v /mydata/nginx/conE:/etc/nginx \
      -d nginx:1.10
      
    • 找到nginx/html目錄

      #切換到html目錄
      cd /mydata/nginx/html
      #創建一個目錄,用於存放es相關的內容
      mkdir es
      #進入es目錄
      cd es
      #創建一個txt文件,用於存放我們分詞的數據
      vi fenci.txt
      
    • 打開文件後,編譯以下內容

      我是
      中國人
      
    • 讓nginx隨系統一起啓動

      docker update nginx --restart=always
      
    • 修改/mydata/elasticsearch/plugins/elasticsearch-analysis-ik/config/中的IKAnalyzer.cfg.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 擴展配置</comment>
            <!--用戶可以在這裏配置自己的擴展字典 -->
            <entry key="ext_dict"></entry>
             <!--用戶可以在這裏配置自己的擴展停止詞字典-->
            <entry key="ext_stopwords"></entry>
            <!--用戶可以在這裏配置遠程擴展字典,主要修改下面這一行爲我們配置的nginx地址+分詞文件路徑 -->
            <entry key="remote_ext_dict">http://192.168.56.10/es/fenci.txt</entry> 
            <!--用戶可以在這裏配置遠程擴展停止詞字典-->
            <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
    
    • 重啓ES

      docker restart elsaticsearch
      
      #效果如下,我是  中國人 
      {
        "tokens" : [
          {
            "token" : "我是",
            "start_offset" : 0,
            "end_offset" : 2,
            "type" : "CN_WORD",
            "position" : 0
          },
          {
            "token" : "中國人",
            "start_offset" : 2,
            "end_offset" : 5,
            "type" : "CN_WORD",
            "position" : 1
          },
          {
            "token" : "中國",
            "start_offset" : 2,
            "end_offset" : 4,
            "type" : "CN_WORD",
            "position" : 2
          },
          {
            "token" : "國人",
            "start_offset" : 3,
            "end_offset" : 5,
            "type" : "CN_WORD",
            "position" : 3
          }
        ]
      }
      

是不是很好玩呢?看到這裏說明你已經有了一定的ES基礎了,下面我們在程序中使用ES提供的功能

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