elasticsearch初探

1,145 阅读4分钟

一、docker部署es

在安装es前,先执行 yum install -y yum-utils device-mapper-persistent-data lvm2 命令,

  • device-mapper-persistent-data:这是 Device Mapper 的一个组件,提供了持久化数据存储功能。这对于 Elasticsearch 数据存储的稳定性和可靠性至关重要。如果没有这些基础组件,在配置和管理 Elasticsearch 的数据存储时可能会受到限制,甚至导致数据丢失或存储管理困难。

  • lvm2:LVM(Logical Volume Manager,逻辑卷管理器)是一种在 Linux 系统中用于灵活管理磁盘空间的技术。LVM 允许系统管理员更灵活地管理磁盘空间。例如,当 Elasticsearch 的数据存储需求增长时,利用 LVM 可以方便地扩展存储卷的大小,而无需重新分区或停机。

拉取es镜像docker pull elasticsearch:7.3.1

安装esdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 --restart=always -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" 3d3aa92f641f

  • 9200端口:es的api请求默认使用9200端口
  • 9300端口:在集群环境下,用于es服务间通信
  • -e "discovery.type=single - node":单节点部署
  • -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m":通过环境变量设置es运行时JVM的堆内存初始大小(-Xms1024m)和最大大小(-Xmx1024m)均为 1024MB。

二、es相关概念

索引库 -- 对比mysql的数据库

索引 -- 对比mysql的表

文档 -- 对比mysql表中的数据

映射 -- 对比mysql的字段约束

三、Http 调用 es 基础操作

3.1 创建索引

put:http://117.72.118.73:9200/subject_info ip+9200/索引名

3.2 创建索引映射

put:http://117.72.118.73:9200/subject_info/_mapping ip+9200/索引名/_mapping

index为是否创建倒排索引,即字段是否能够被搜索,默认为true; 被搜索时,需要指定分词器analyzer

{
    "properties": {
        "subject_id": {  //字段名
            "type":"long", //type:数据类型
            "index":true        
        },
        "subject_name":{
            "type":"text",
            "index":true,
            "analyzer":""
        },
        "subject_answer":{
            "type":"text",
            "index":"true",
            "analyzer":""
        }
    }
}

image.png

3.3 创建文档

post:http://117.72.118.73:9200/subject_index/_doc ip+9200/索引名/_doc

{
    "subject_id":1,
    "subject_name":"redis是什么",
    "subject_answer":"是一种缓存"
}

image.png

3.4 查询所有文档

get:http://117.72.118.73:9200/subject_index/_search ip+9200/索引名/_search

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "subject_index",
        "_type": "_doc",
        "_id": "N-myXpQBgH2t9AyXqPsX",
        "_score": 1,
        "_source": {
          "subject_id": 1,
          "subject_name": "redis是什么",
          "subject_answer": "是一种缓存"
        }
      },
      {
        "_index": "subject_index",
        "_type": "_doc",
        "_id": "OOm2XpQBgH2t9AyXIfsq",
        "_score": 1,
        "_source": {
          "subject_id": 1,
          "subject_name": "mysql是什么",
          "subject_answer": "是一个数据库"
        }
      }
    ]
  }
}

  • took:花费时间 ms级别
  • timeout:是否超时
  • _shards:分片关系
  • max_score:查询结果与查询内容的匹配度,越高越精准
  • hits:命中结果
  • relation:是否准确,eq代表准确,gte不准确
  • _source:文档内容

3.5 全文检索查询

get:http://117.72.118.73:9200/subject_index/_search ip+9200/索引名/_search

  • 单字段 match查询,对查询内容进行分词,返回与倒排索引库中词条匹配的文档
{
    "query":{
        "match":{
            "subject_name":"mysql哥哥哥"  //字段名:查询内容
        }
    }
}
  • 多字段multi_match查询,对查询内容进行分词符合其中任意一个字段就算满足查询条件,返回与倒排索引库中词条匹配的文档
{
    "query":{
        "multi_match":{
            "query":"mysql哥哥哥",    //"query":查询内容
            "fields":["subject_name", "subject_answer"]   //"fields":["字段1","字段2"...]
        }
    }
}

image.png

3.6 精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。

  • term:根据词条精确值查询
{
  "query": {
    "term": {
        "subject_name": "mysql哥哥哥"
    }
  }
}

image.png

因为精确term查询的字段是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,只有用户输入的内容跟字段值完全匹配时才认为符合条件。因此如果用户输入的内容过多,反而搜索不到数据。

  • range:根据值的范围查询

范围range查询,一般应用在对数值类型做范围过滤的时候。比如对价格、日期范围过滤,。

{
    "query": {
        "range": {
            "FIELD": {
                "gte": number,
                "lte": number
            }
        }
    }
}

四、ik分词器

es默认分词器,只支持英文分词,当输入中文时,无法进行识别,会一个字一个字拆分;所以要使用ik分词器,进行中文分词,分词器分的好,搜索的东西才展现的好。

插件地址:github.com/medcl/elast…

先把ik插件传入服务器,存放任意文件夹内
mkdir /soft/ik -p

进入es容器内部自带的plugins文件夹中,并创建ik文件夹
docker exec -it elasticsearch /bin/bash
cd plugins
mkdir ik

回到外部,把本地的ik文件夹传入容器内
docker cp /soft/ik/. elasticsearch:/usr/share/elasticsearch/plugins/ik

重启es
docker restart elasticsearch

检验分词器接口http://117.72.118.73:9200/_analyze ip+9200/_analyze

  • es原生分词器
{
    "analyzer":"standard",
    "text":"我是哥哥哥"
}

image.png

  • IK分词器包含两种模式:

    • ik_smart:最少切分,粗粒度,搜索到概率较小但比较节省内存
    • ik_max_word:最细切分,细粒度,搜索到概率更大但比较占用内存
{
    "analyzer":"ik_smart",
    "text":"我是数据库"
}

image.png

{
    "analyzer":"ik_max_word",
    "text":"我是数据库"
}

image.png