大数据开发Elasticsearch的基本使用(第五十八篇)

211 阅读4分钟

这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

一、ES的基本使用

针对ES操作,官方提供了很多种操作方式。www.elastic.co/guide/en/el…

image-20230223221425708

可以看到ES支持很多种客户端,如果在实际工作中使用ES的时候,想要屏蔽语言差异,建议使用RestAPI。其实就是通过URL去访问,这种兼容性比较好,可以跨语言,任何语言都可以去操作这种HTTP请求。但是有时候操作起来比较麻烦,需要拼装各种数据字符串,参数需要自己拼装,最终的结果也需要解析,比较麻烦,但是兼容性比较好。而对于Java语言而言,还有一种选择,使用Java Rest Client。这种方式相对于Rest API而言,它的代码量会大一些,但是从代码层面来看,它是比较清晰的。

1.1、RestAPI操作ES
  1. 创建名称为test的索引库

    注意:索引库可以提前创建,也可以在后续添加数据的时候直接指定一个不存在的索引库,ES会默认自动创建索引库

    手工创建:可以自定义索引库的任务数的分片数量以及配置

    自动创建:取参数的默认值

    ps:索引库名称规范:必须全部小写并且不能以下划线(_)、横杠(-)、加号(+)开头,里面也不能包含逗号

    curl -XPUT 'http://192.168.234.100:9200/test'

    image-20230223222344274

  2. 删除索引库

    curl -XDELETE 'http://192.168.234.100:9200/test'

    image-20230223222739675

  3. 创建指定3个分片库的索引库

    curl -H "Content-Type:application/json" -XPUT 'http://192.168.234.100:9200/test' -d '{"settings":{"index.number_of_shards":3}}'

    image-20230223223253220

  4. 添加数据 往test索引库里面的_doc类型添加索引为1的数据

    curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc/1' -d '{"name":"zhangsan","age":18}'

    image-20230223223947273

    如果不指定id的话,会随机生成一个Id

    curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc' -d '{"name":"lisi","age":19}'

    image-20230223224651256

  5. 查询数据

    curl -XGET 'http://192.168.234.100:9200/test/_doc/1?pretty'

    image-20230223224815734

  6. 指定获取结果

    curl -XGET 'http://192.168.234.100:9200/test/_doc/1?_source=name&pretty'

    image-20230223224934361

  7. 全表扫描查询

    curl -XGET 'http://192.168.234.100:9200/test/_search?&pretty'

    image-20230223230225395

  8. 全部更新

    相同id直接赋给原来的内容

    执行更新的时候,ES会将你的旧的文档标记为删除,然后添加新的文档,旧的文档不会立刻消失,但是你也访问不了。ES会自动删除

    curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc/1' -d '{"name":"zhangsan_new","age":180}'

    image-20230223230543375

  9. 局部更新

    curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_update/1/' -d '{"doc":{"age":25}}'

    image-20230223231016948

1.2、Bulk API

格式:

{action:{metadata}}
{request body}
  • action:index(添加索引)(数据已经存在,不会报错)/create(添加索引)(数据已经存在,则报错)/update(更新索引)/delete(删除索引)
  • metadata:元数据信息:是_index_type_id
  • request body :_source(删除操作不需要)
{"index":{"_index":"bulk_test","_type":"_doc","_id":"1"}}
{"name":"zhangsan"}
{"index":{"_index":"bulk_test","_type":"_doc","_id":"2"}}
{"name":"lisi"}

把上面文件vim 保存在request里面

vim request

curl -H "Content-Type:application/json" -XPUT 'http://192.168.234.100:9200/bulk_test/_doc/_bulk' --data-binary @request

Bulk实际项目中最好不要超过100m

二、ES分词介绍

比如我们把Hello World,这条数据在ES中创建索引,方便后期检索,那对应的创建索引和查询索引的大致流程是这样的,

创建索引的过程:首先会对这个数据,也就是原始数据,对这个数据做一个空白字符切割,然后把它切分为两个单词,然后再做一个单词切割,把Hello World切割成HelloWorld然后再执行一个小写转换的操作,把这些英文单词全部转换成小写。

查询索引的过程:想要把ES里面这些数据给它检索出来,但是这条数据的具体内容记不清了,只能大致想起一些核心关键词,类似于Hello,首先针对你输入的关键词,做一个空白符分割,把它切成多份,然后再执行小写转换。这样检索的时候就忽略英文大小写。

所以以后在搜索引擎搜索内容的时候,怎么快速高效的检索,就是输入一些核心的关键词。关键词中间最好你提前使用空格分开,这样避免它去做空白符分割,单词切割的shih,它可能给你分的不太合理,这样的话,你前期把自己的核心关键词给分割开。针对英文字符,输入的时候不用纠结大小写。

这些数据最终在ES里面去分词后,这些数据在底层,它其实会产生一个倒排索引。这个倒排索引是ES能够提供快速检索能力的最核心的东西

正排索引:文档ID到文档内容和单词的关联;倒排索引:单词到文档ID的关系

2.1、ES中文分词插件(es-ik)
  1. ES官方默认的分词插件,对中文分词效果不理想
  2. 针对中文分词,需要在ES中集成中文分词器
操作步骤:
  1. github.com/medcl/elast…下载

  2. 解压到指定目录

    unzip elasticsearch-analysis-ik-7.17.6.zip -d /usr/local/elasticsearch-7.17.6/plugins/ik

  3. 重启es服务,root用户切换elastic用户

    bin/elasticsearch -d

测试:

curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_analyze?pretty' -d '{"text":"大家是帅哥"}'

image-20230226143916227

PS:这边使用的是谷歌浏览器插件:Multi Elasticsearch Head

curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_analyze?pretty' -d '{"text":"大家是帅哥","tokenizer":"ik_max_word"}'

image-20230226144109808

其中/usr/local/elasticsearch-7.17.6/plugins/ik/config里面有stopword.dic。并且可以在/usr/local/elasticsearch-7.17.6/plugins/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>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>