您的位置:首页 > 娱乐 > 八卦 > Elastic Search (ES)Java 入门实操(1)下载安装、概念

Elastic Search (ES)Java 入门实操(1)下载安装、概念

2024/12/25 10:45:53 来源:https://blog.csdn.net/2302_79789602/article/details/139513991  浏览:    关键词:Elastic Search (ES)Java 入门实操(1)下载安装、概念

实现数据查询代码:Elastic Search(ES)Java 入门实操(2)搜索代码-CSDN博客

Elastic Search(ES)Java 入门实操(3)数据同步-CSDN博客

Elastic Search 官方描述,是一个分布式的搜素数据分析引擎,可以集中存储数据,快速完成搜索,微调相关性,进行强大的分析。

ES 中的索引、映射、文档和字段等概念和传统关系型数据库相似。可以结合数据库去理解。比如索引可以理解为表。

ES 使用了倒排索引机制来优化搜索效率。比如”唱跳rap篮球“,根据机制可能会为 唱跳、rap、篮球分别建立索引,当我们搜索其中一个关键词,就能搜索出来相关的结果,然后通过正排索引来详细展示相关文章。

官方文档:Quick start | Elasticsearch Guide [7.17] | Elastic

下载安装

需要下载的有 Elastic Search 和 kibana(可视化界面)

Elastic Search 下载地址:Elasticsearch 7.17.21 | Elastic

kibana 下载地址:Install Kibana on Windows | Kibana Guide [7.17] | Elastic

推荐下载 7.17版本,避免出现其他问题。

下载完成后直接解压即可,路径名不要带有中文

在解压目录的 bin 目录下使用 cmd 命令 elasticsearch 就可以启动,访问端口 localhost:9200

同样的 kibana 也是在 bin 目录下启动 kibana 命令,可视化界面的端口号是 5601

在左侧边栏使用 Dev Tools 即可进入控制台使用 ES 自己的操作数据的语法

DSL

应用最广的,是 Json 格式,好理解,和 http 请求兼容

官方文档:Query DSL | Elasticsearch Guide [7.17] | Elastic

新增数据

井号后面是注释,实际使用不需要

注意:当添加新数据时如果不指定 id ,ES 会自动生成,类型是 string 类型,如果需要在代码层面和 MySQL 同步,最好是新增的时候指定 id ,避免出现类型不同等其他问题。

POST#请求的类型 post_1#表的名称 /_doc/ 5#id
{ #字段和数据"title": "kun","desc": "唱跳"
}#结果
{"_index" : "post_v1","_type" : "_doc","_id" : "5","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 6,"_primary_term" : 3
}

查询

#查询对应的表
GET post_v1/_search
#根据 id 查询
GET post_v1/_doc/5

修改

POST post_v1/_doc/5
{"title": "cxk","desc": "ctrl"
}

 实际修改数据和新增数据格式差不多,只需要指定对应的 id 即可,如果表(索引)中没有对应的 id,就会直接创建新的数据。

一句话概括就是有就修改,没有就新增,所以也不会出现重复修改的情况,因为只要有就会修改。

删除

#删除普通索引
DELETE index_name
#删除数据流式索引
DELETE _data_stream/logs-my_app-default

ES 还有其他格式的 Query 格式命令,比如 EQL、SQL、Painless Scrpiting language,详情可以查看官方文档。

Mapping

官方文档:Mapping | Elasticsearch Guide [7.17] | Elastic

相当于数据库表的表结构,字段和字段类型。有的字段不指定会自动生成,比如主键 id。

ES 支持动态 mapping,表结构可以动态改变,如果表结构中不存在的字段,如果插入了数据,也能插入,并新增字段。

也可以手动指定字段类型,显式创建 mapping

PUT user
{"mappings": {"properties": {"age":    { "type": "integer" },  "email":  { "type": "keyword"  }, "name":   { "type": "text"  }     }}
}

分词器

顾名思义,就是 ES 的一种分词策略/规则

官方文档:Test an analyzer | Elasticsearch Guide [7.17] | Elastic

#使用空格分词
POST _analyze
{"analyzer": "whitespace","text":     "The quick brown fox."
}
#标准分词
POST _analyze
{"tokenizer": "standard","filter":  [ "lowercase", "asciifolding" ],"text":      "Is this déja vu?"
}
#关键词分词,整句当作一个关键词,不分开
POST _analyze
{"analyzer": "keyword","text":     "The quick brown fox."
}

官方提供的分词器问题在于对于中文来说不太友好 ,中文是不使用空格作为分隔的。

IK 分词器

中文友好,文档:GitHub - infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK analyzer into Elasticsearch and OpenSearch, support customized dictionary.

下载地址:Index of: analysis-ik/stable/ (infinilabs.com) 

注意版本,本文的 ES 版本为 7.17.21,避免出现兼容性问题

下载完成后在 ES 文件夹中新建 plugins 文件夹,然后把下载的插件解压到里面。重启 ES 和 kibana 即可加载。

载入成功

IK 分词器有两种:ik_smart、ik_max_word
打个比方,天青色等烟雨而我在等你,ik_smart 是按照系统自己认为的方式进行组词,比如青色,烟雨,ik_max_word 是最大细度得组词,比如,天青,青色,都是系统认为的词语。

POST _analyze
{"analyzer": "ik_smart","text":     "天青色等烟雨而我在等你"
}
#结果
{"tokens" : [{"token" : "天","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "青色","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 1},{"token" : "等","start_offset" : 3,"end_offset" : 4,"type" : "CN_CHAR","position" : 2},{"token" : "烟雨","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 3},{"token" : "而我","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 4},{"token" : "在","start_offset" : 8,"end_offset" : 9,"type" : "CN_CHAR","position" : 5},{"token" : "等你","start_offset" : 9,"end_offset" : 11,"type" : "CN_WORD","position" : 6}]
}
POST _analyze
{"analyzer": "ik_max_word","text":     "天青色等烟雨而我在等你"
}
#结果
{"tokens" : [{"token" : "天青","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "青色","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 1},{"token" : "等","start_offset" : 3,"end_offset" : 4,"type" : "CN_CHAR","position" : 2},{"token" : "烟雨","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 3},{"token" : "而我","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 4},{"token" : "在","start_offset" : 8,"end_offset" : 9,"type" : "CN_CHAR","position" : 5},{"token" : "等你","start_offset" : 9,"end_offset" : 11,"type" : "CN_WORD","position" : 6}]
}

 即使使用了分词器,系统也不一定能够按照我们想的方式进行分词,比如我叫 李二狗,拆出来是李、二、狗,不会把我的名字作为关键词进行分词。ik有一个词典机制,就和输入法的词库类似,我们只需要将我们想要分成的词写成词典即可。

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" : "TYPE_CNUM","position" : 1},{"token" : "狗","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 2}]
}

IK 词典

首先进入到 解压的 IK 插件目录,进入 config 目录,elasticsearch-7.17.21\plugins\ik\config。

找到 IKAnalyzer.cfg.xml 文件,打开可以看见这里就是添加词典的地方

然后在 config 目录下新建一个词典,名字最好是中文,后缀是 .dic,然后在里面加上想要作为分词的词组。

再然后在刚刚的文件中把词典添加进去

重启 ES 和 kibana,测试,发现按照词典进行分词了。

篇幅有限,Java 整合 ES 在下一篇文章。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com