初识ElasticSearch-入门简介①

189 阅读7分钟
es版本8.X window版本,作为学习之用。

ElasticSearch8的改变

速度、扩展和相关性

速度、扩展和相关性方面进入了一个全新的 Elastic 8.0 时代,减少内存使用(从而让每个节点托管更多的数据),降低查询开销(在大规模部署中成效尤为明显),引入一些全新的功能来提高相关性。

通过原生矢量搜索提高搜索相关性

Elastic 8.0 版引入了一整套原生矢量搜索功能,让客户和员工能够使用他们自己的文字和语言来搜索并收到高度相关的结果。

在 Elasticsearch 8.0 版中,我们将对自然语言处理 (NLP) 模型的原生支持直接引入了 Elasticsearch,让矢量搜索功能更容易实现。此外,Elasticsearch 8.0 版还包含了对近似最近邻 (ANN) 搜索的原生支持,因此可以快速且大规模地比较基于矢量的查询与基于矢量的文档语料库。

强大的 NLP 功能打开全新的分析世界

Elasticsearch 始终是执行 NLP 的理想之选,但过去它需要在 Elasticsearch 之外进行一些处理,或编写一些相当复杂的插件。在 8.0 版中,用户现在可以直接在 Elasticsearch 中执行命名实体识别、情感分析、文本分类等,而无需使用额外的组件或进行编码。在 Elasticsearch 中原生计算和创建矢量,不仅在水平可扩展性方面取得了“胜利”(通过在服务器集群中分布计算资源来实现),这一变化还为 Elasticsearch 用户显著节省了时间和精力。

在 Elastic 8.0 版中,用户可以直接在 Elasticsearch 中使用 PyTorch Machine Learning 模型(如 BERT),并在 Elasticsearch 中原生使用这些模型执行推理。这些模型可以是您自己的定制模型,也可以是在 Hugging Face 等资源库中向社区发布的模型。

通过支持用户直接在 Elasticsearch 中执行推理,将强大的现代 NLP 功能整合到搜索应用程序和体验变得比以往更加容易(想想看:无需编码),本质上更加高效(得益于 Elasticsearch 的分布式计算功能),而且 NLP 本身的速度也会显著加快,因为您无需将数据移动到单独的进程或系统中。

快速、大规模搜索

因为 Elastic 8.0 版是基于 Lucene 9.0 开发的,那些利用现代 NLP 的搜索体验,都可以借助(新增的)对近似最近邻搜索的原生支持,快速且大规模地实现。通过 ANN,可以快速并高效地将基于矢量的查询与基于矢量的文档语料库(无论是小语料库、大语料库还是巨型语料库)进行比较。

重要更新
  1. Rest API相比较7.x而言做了比较大的改动(比如彻底删除_type),为了降低用户的升级成本,8.x会暂时的兼容7.x的请求。
  2. 默认开启安全配置(三层安全),并极大简化了开启安全需要的工作量,可以这么说:7.x开启安全需要10步复杂的步骤比如CA、证书签发、yml添加多个配置等等,8.x只需要一步即可)。
  3. 存储空间优化:更新了倒排索引,对倒排文件使用新的编码集,对于keyword、match_only_text、text类型字段有效,有3.5%的空间优化提升,对于新建索引和segment自动生效。
  4. 优化geo_point,geo_shape类型的索引(写入)效率:15%的提升。
  5. 新特性:支持上传pyTorch模型,在ingest的时候使用。比如在写入电影评论的时候,如果我们想要知道这个评论的感情正负得分,可以使用对应的AI感情模型对评论进行运算,将结果一并保存在ES中。
  6. 技术预览版KNN API发布,(K邻近算法),跟推荐系统、自然语言排名相关。之前的KNN是精确搜索,在大数据集合的情况会比较慢,新的KNN提供近似KNN搜索,以提高速度。
  7. 对ES内置索引的保护加强了:elastic用户默认只能读,如果需要写权限的时候,需有allow_restrict_access权限
  8. 运行条件
  9. 需要 Java 17 才能运行 Elasticsearch。

简介

Elasticsearch是面向文档的,这意味着它可以存储整个对象或文档(document)。然而它不仅
仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:

关系数据库DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns
Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields

ElasticSearch安装(windows)

下载压缩包:

ElasticSearch的官方地址: www.elastic.co/cn/elastics…

解压过后

image.png

config\elasticsearch.yml中末尾加入:

http.cors.enabled: true 
http.cors.allow-origin: "*" 
network.host: 127.0.0.1

目的是使ES支持跨域请求

启动类似tomcat,在bin目录中,找到elasticsearch.bat

注意:9300是tcp通信端口,es集群之间使用tcp进行通信,9200是http协议端口。 于是本机输入http://localhost:9200即可访问。

但是可以安装图形化插件elasticsearch-head;在谷歌浏览器中添加该插件。打开该插件,输入地址访问如下:

image.png 如果安装了ik分词插件: 关于ik分词器的分词类型(可以根据需求进行选择):

ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart

会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”

创建索引(test)

PUT http://localhost:9200/test
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "search_analyzer":"ik_smart",
        "analyzer":"ik_smart"
      },
      "age": {
        "type": "integer"
      },
      "addr": {
        "type": "text",
        "search_analyzer":"ik_max_word",
        "analyzer":"ik_max_word"
      },
      "time": {
        "type": "date"
      },
      "status": {
        "type": "integer"
      }
    }
  }
}

查询指定索引映射信息

GET http://localhost:9200/test/_mappings

删除指定索引

DELETE http://localhost:9200/test

添加或修改

给索引添加或者修改一条数据 语法: POST /index/_doc/文档的id 文档id就相当于数据库的行id

POST http://localhost:9200/test/_doc/2
{
  "name":"张三",
  "age":23,
  "time":"2023-03-12",
  "addr":"长沙市岳麓区",
  "status":1
}

_doc : 如果存在那么就是修改,如果不存在那么就是添加

删除指定文档

DELETE http://localhost:9200/test/_doc/1

查询es中所有索引内的信息

GET http://localhost:9200/_search
{
  "query": {
    "match_all": {}
  }
}

查询指定索引内的信息

GET http://localhost:9200/test/_search
{
  "query": {
    "match_all": {}
  }
}

分页查询指定索引内的信息

GET http://localhost:9200/test/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 1
}

from: 起始值
size: 查询多少条 相当于关系型数据库pageNo,pageSize

复杂查询

查询指定属性 查询name是张三的相关分词数据

GET http://localhost:9200/test/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

指定属性排序

查询name是张的相关分词数据,并且以年龄倒序

GET http://localhost:9200/test/_search
{
  "query": {
    "match": {
      "name": "张"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

属性过滤(where)

term针对查询不会进行分词操作 查询年龄是31的

GET http://localhost:9200/test/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "age": 31
          }
        }
      ]
    }
  }
}

范围查询

大于20 并且小于30 ,以倒序显示(大->小)

GET http://localhost:9200/test/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 30
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}
聚合查询

查询name是张的相关分词,并且以age聚合求出相关年龄有多少人

GET http://localhost:9200/test/_search
{
  "query": {
    "match": {
      "name": "张"
    }
  },
  "aggs": {
    "group_by_age": {
      "terms": {
        "field": "age"
      }
    }
  }
}

结果:

image.png

高亮查询

fragment_size :指定高亮数据展示多少个字符回来,不添加默认全部显示

pre_tag:指定前缀标签,如 <font color="red">

post_tags:指定后缀标签,如 </font> field:指定那个字段为高亮字段

GET http://localhost:9200/test/_search
{
  "query": {
     "match_phrase": {"name" : "张三"}
  },
  "highlight": {
    "fields": {
      "dec": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 20
  }
}

多字段高亮

查询name或者dec, 并且高亮查询结果

GET http://localhost:9200/test/_search
{
  "query": {
    "bool": {
       "should" : [
         {"match": { "name" : "张" }},
         {"match" : { "addr" : "岳麓" }} 
       ]
    }
  },
  "highlight": {
    "fields": {
      "dec": {},
      "name": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 20
  }
}

结果如下:

image.png

添加ik分词器

安装ik分词器

注意:  要和es的版本一致 ,否则启动es会报错 地址: github.com/medcl/elast… 下载后的解压的文件夹重命名ik,重启elasticsearch即可

使用ik分词器创建索引

ik_max_word 是最大分词 ,ik_smart是最小分词

注意: ik分词器只适用于text文本类型的字段

 Text:
 会分词,然后进行索引
 支持模糊、精确查询
 不支持聚合
 keyword:
 不进行分词,直接索引
 支持模糊、精确查询
 支持聚合
 

修改支持ik分词

PUT http://localhost:9200/test/
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      }
    }
  }
}