从零到壹搭建一个商城架构--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提供的功能

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