1.es 的集成ik 分词
1.1 ik 分词
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版
开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词
和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于
Lucene项目,同时提供了对Lucene的默认优化实现。
1.2 ik分词的特点
1.采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
2.采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数
量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
3.支持个人词条的优化的词典存储,更小的内存占用。
4.支持用户词典扩展定义。
5.针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索
排列组合,能极大的提高Lucene检索的命中率。
1.3 下载地址:
https://github.com/medcl/elasticsearch-analysis-ik/tags?after=v8.0.0
对应文章中es版本.
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.12.0
1.4 在elasticsearch安装目录的plugins目录下新建 analysis-ik 目录
[root@basenode analysis-ik]# pwd
/root/tools/elasticsearch/plugins/analysis-ik
[root@basenode analysis-ik]# unzip elasticsearch-analysis-ik-7.12.0.zip
[root@basenode analysis-ik]# rm -rf elasticsearch-analysis-ik-7.12.0.zip
1.5 重启es
[root@basenode analysis-ik]# docker restart 949389b28b4e 6bc63ce3ab40 ea28731af194
949389b28b4e
6bc63ce3ab40
ea28731af194
[root@basenode analysis-ik]#
遇到一个错误 采用上门的访问就会报下面的错误
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.12.0.jar:7.12.0]",
"... 6 more"] }
java.lang.IllegalStateException: Could not load plugin descriptor for plugin directory [elasticsearch-analysis-ik-7.12.0]
Likely root cause: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.12.0/plugin-descriptor.properties
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218)
at java.base/java.nio.file.Files.newByteChannel(Files.java:375)
at java.base/java.nio.file.Files.newByteChannel(Files.java:426)
at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:420)
at java.base/java.nio.file.Files.newInputStream(Files.java:160)
at org.elasticsearch.plugins.PluginInfo.readFromProperties(PluginInfo.java:173)
at org.elasticsearch.plugins.PluginsService.readPluginBundle(PluginsService.java:405)
at org.elasticsearch.plugins.PluginsService.findBundles(PluginsService.java:382)
at org.elasticsearch.plugins.PluginsService.getPluginBundles(PluginsService.java:375)
at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:146)
at org.elasticsearch.node.Node.<init>(Node.java:336)
at org.elasticsearch.node.Node.<init>(Node.java:278)
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:217)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:217)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:397)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:116)
at org.elasticsearch.cli.Command.main(Command.java:79)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)
For complete error details, refer to the log at /usr/share/elasticsearch/logs/elasticsearch.log
1.6 在镜像内部进行安装分词
进入docker
docker exec -it elasticsearch /bin/bash
下载安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
确认输入y
过程:
[root@basenode ~]# docker exec -it elasticsearch /bin/bash
^[[D[root@949389b28b4e elasticsearch]#
[root@949389b28b4e elasticsearch]# ls
LICENSE.txt NOTICE.txt README.asciidoc bin config data jdk lib logs modules plugins
[root@949389b28b4e elasticsearch]# ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
-> Installing https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.net.SocketPermission * connect,resolve
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
Continue with installation? [y/N]y
-> Installed analysis-ik
-> Please restart Elasticsearch to activate any plugins installed
[root@949389b28b4e elasticsearch]#
执行
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
},
{
"token" : "人我",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "爱",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 6
},
{
"token" : "大数",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 7
},
{
"token" : "数据",
"start_offset" : 8,
"end_offset" : 10,
"type" : "CN_WORD",
"position" : 8
}
]
}
2. 创建索引
语法
PUT /索引名称
{
"settings":
{ "属性名": "属性值" }
}
# 实例
PUT /wudldb
# 判断索引是否存在
HEAD /索引名称
#查看索引
GET /索引名称
# 批量创建索引
GET /索引名称1,索引名称2,索引名称3,...
# 查看所有索引
GET _all
# 或者
GET /_cat/indices?v
#打开索引
POST /索引名称/_open
#关闭索引
POST /索引名称/_close
#删除索引
DELETE /索引名称1,索引名称2,索引名称3...
3. 映射操作
PUT /索引库名/_mapping
{
"properties":
{
"字段名":
{
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
#字段名:任意填写,下面指定许多属性,例如:
#type:类型,可以是text、long、short、date、integer、object等
#index:是否索引,默认为true
#store:是否存储,默认为false
#analyzer:指定分词器
# 实例
PUT /wudldb-index
PUT /wudldb-index_mapping/
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}
3.1 打开索引
#查看映射关系
GET /索引名称/_mapping
# 或者
GET _mapping
#或者
GET _all/_mapping
3.2 修改索引
修改索引和映射之间的关系
PUT /索引库名/_mapping
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
3.3 打开索引
POST /索引名称/_open
3.4 关闭索引
P0ST /索引名称/_close
3.5 删除索引
DELETE /索引名称1,索引名称2,索引名称3...
4. 索引的映射
简介:
索引创建之后,等于有了关系型数据库中的database。Elasticsearch7.x取消了索引type类型的设置,
不允许指定类型,默认为_doc,但字段仍然是有的,我们需要设置字段的约束信息,叫做字段映射(mapping)
4.1 创建索引字段
PUT /索引库名/_mapping
{
"properties":
{
"字段名":
{
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
字段名:任意填写,下面指定许多属性,例如:
type:类型,可以是text、long、short、date、integer、object等
index:是否索引,默认为true
store:是否存储,默认为false
analyzer:指定分词器
4.1.1 实例
PUT /wudldb-index
PUT /wudldb-index/_mapping/
{
"properties": {
"name": {
"type": "text"
},
"job": {
"type": "text"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}
4.2 映射的字段类型简介
基本可以分为以下几类
String类型,又分两种
1.text:可分词,不可参与聚合
2.keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合。
Numerical:数值类型,分两类
1.基本数据类型:long、interger、short、byte、double、float、half_float.
2.浮点数的高精度类型:scaled_float.
1.需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储.
Date:日期类型
1.elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省
空间。
Array:数组类型:
1.进行匹配时,任意一个元素满足,都认为满足
2.排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
Object:对象
4.3 查看映射关系
GET /索引名称/_mapping 或者
GET _all/_mapping
GET _mapping
4.4 一次性创建索引和映射
put /索引库名称
{
"settings":{
"索引库属性名":"索引库属性值"
},
"mappings":{
"properties":{
"字段名":{
"映射属性名":"映射属性值"
}
}
}
}
#实例
PUT /wubigdata
{
"settings": {},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
5. 文档增删改查操作
5.1 新增文档
实例
POST /wubigdata/_doc/1
{
"name": "flink",
"job": "大数据架构师",
"payment": "30000",
"logo": "https://image.baidu.com/"
}
自动生成id
POST /索引名称/_doc
{
"field":"value"
}
5.2 查看单个文档
语法
GET /索引名称/_doc/{id}
5.3 查看所有文档
/索引名称/_search
{
"query":{
"match_all": { }
}
}
5.4 _source定制返回结果
场景:
某些业务场景下,我们不需要搜索引擎返回source中的所有字段,可以使用source进行定制,如下,多个字段之间使用逗号分隔。
实例:
GET /wubigdata/_doc/1?_source=name,job
5.5 文档的更新
5.5.1 全部更新
POST /wubigdata/_doc/1
{
"name": "flink",
"job": "大数据架构师2",
"payment": "30000",
"logo": "https://image.baidu.com/"
}
5.5.1 局部更新
POST /索引名/_update/{id}
{
"doc":{
"field":"value"
}
}
5.6 删除文档
根据id 进行删除
DELETE /索引名/_doc/{id}
删除全部文档
POST 索引名/_delete_by_query
{
"query": {
"match_all": {}
}
}
5.7 文档的全量替换、强制创建
强制创建
PUT /index/_doc/{id}?op_type=create {},PUT /index/_doc/{id}/_create {}
如果id 存在就会报错