目录
一、ElasticSearch介绍
1.什么是ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个基于RESTful web接口的分布式全文搜索引擎。ElasticSearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
1、elasticsearch是一个基于Lucene的分布式全文检索服务器。
2、elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。
2.ElasticSearch原理
正排索引:查字典从第一页开始找,直到找到为止(文档---->关键字)
倒排索引(Inverted index):也常被称为反向索引,倒排索引是从关键字到文档的映射(已知关键 字求文档)。
倒排索引表的组成:
term
trem------------------------>document
document分词列表的特点:1.不重复 2.“的 地 得 a an the”语气词不参加分词 3.不搜索的filed不参加分词,eg:图片地
逻辑结构部分是一个倒排索引表,由三部分组成:
1、将搜索的文档最终以Document方式存储起来。
2、将要搜索的文档内容分词,所有不重复的词组成分词列表。
3、每个分词和docment都有关联。
二、安装ElasticSearch
1.环境需求
1、jdk必须是jdk1.8.0_131以上版本。
2、ElasticSearch 需要至少4096 的线程池和 262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存
3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动
4、Elasticsearch的插件要求至少centos的内核要3.5以上版本
2.下载ES
(1)下载:ElasticSearch官网:免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
(2)设置虚拟机的内存: >=1.5G
(3) 创建用户
从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一 个用户。
①创建elk用户组
groupadd elk
②创建用户admin
useradd admin
passwd admin
③将admin用户添加到elk组
usermod -G elk admin
④为用户分配权限
#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local
⑤切换用户
su admin
3.安装ES
(1)解压并安装
tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
(2)ES的目录结构
bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。
(3)配置文件
elasticsearch.yml:用于配置Elasticsearch运行参数
jvm.options:用于配置Elasticsearch JVM设置
log4j2.properties:用于配置Elasticsearch日志
3.修改配置文件
(1)修改elasticsearch.yml
cluster.name: power_shop
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
(2) 修改jvm.options
设置最小及最大的JVM堆内存大小:
在jvm.options中设置 -Xms和-Xmx:
1) 两个值设置为相等
2) 将Xmx
设置为不超过物理内存的一半。
默认内存占用太多了,我们调小一些:
-Xms512m
-Xmx512m
(3)log4j2.properties
日志文件设置,ES使用log4j,注意日志级别的配置。
4.ES启动和关闭
(1)启动
./elasticsearch
#或
./elasticsearch -d
(2)关闭
ps-ef|grep elasticsearch
kill -9 pid
5.解决遇到的问题
(1)解决内核问题
修改elasticsearch.yml文件,在最下面添加如下配置:
bootstrap.system_call_filter: false
(2)解决文件创建权限的问题
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。
使用root用户修改配置文件:
vim /etc/security/limits.conf
追加下面的内容
* soft nofile 65536
* hard nofile 65536
(3)解决线程开启限制问题
[2]: max number of threads [1024] for user [admin] is too low, increase to at least [4096]
默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024 个线程。必须修改限制数为4096+。因为 ES 至少需要 4096 的线程池预备。
如果虚拟机的内存是 1G,最多只能开启 3000+个线程数。至少为虚拟机分配 1.5G 以上的内存。
使用root用户修改配置:
su root
vim /etc/security/limits.conf:
添加
* soft nproc 4096
* hard nproc 4096
(4)解决虚拟内存问题
[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存
su root
vim /etc/sysctl.conf:
vm.max_map_count=655360
sysctl -p
6.测试
ES 中只要启动了任意一个 ES 应用就是启动了一个 ES的 cluster 集群。默认的 ES集群命名为 elasticsearch。如果启动了多个应用(可以在多个节点或单一节点上启动多个应用),默认的ES 会自动找集群做加入集群的过程。
浏览器访问:http://192.168.xxx.xxx:9200
返回结果如下:
{
"name" : "power_shop_node_1", # node name 结点名称。随机分配的结点名称
"cluster_name" : "power_shop", # cluster name 集群名称。 默认的集群名称
"cluster_uuid" : "RqHaIiYjSoOyrTGq3ggCOA", # 集群唯一 ID
"version" : {
"number" : "6.2.3", #版本号
"build_hash" : "c59ff00",
"build_date" : "2018-03-13T10:06:29.741383Z",#发布日期
"build_snapshot" : false,#是否快照版本
"lucene_version" : "7.2.1",#lucene版本号
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
三.安装Kibana
3.1.什么是Kibana
Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。
kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)
3.2 Kibana的安装和配置
3.2.1.下载
ElasticSearch官网:免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
3.2.2.安装
在window中安装Kibana很方便,解压即安装
3.2.3.修改配置
修改config/kibana.yml配置:
server.port: 5601
server.host: "0.0.0.0" #允许来自远程用户的连接
elasticsearch.url: http://192.168.204.132:9200 #Elasticsearch实例的URL
3.2.4.启动
./bin/kibana
3.2.5.测试
浏览器访问:http://127.0.0.1:5601http://127.0.0.1:5601
四.安装head
4.1.什么是head
head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。从ES6.0开始,head插件支持使得node.js运行。
4.2.安装
1、下载head
下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster
2、运行
npm run start
4.3.测试
浏览器访问:Node ExporterNode Exporter Node Exporter
五.ES快速入门
ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。
5.1.index管理
5.1.1.创建index
索引库。包含若干相似结构的 Document 数据,相当于数据库的database。
语法:PUT /index_name
如:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span>
{
<span style="color:#000000">"settings"</span>: {
<span style="color:#000000">"number_of_shards"</span>: <span style="color:#116644">2</span>,
<span style="color:#000000">"number_of_replicas"</span>: <span style="color:#116644">1</span>
}
}</span></span>
number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力
number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0
效果:
5.1.2.修改index
注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。
语法:PUT /index_name/_settings
如:
PUT /java06/_settings
{
"number_of_replicas" : 1
}
ES 中对 shard 的分布是有要求的,有其内置的特殊算法:
Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。
5.1.3.删除index
DELETE /java06[, other_index]
5.2.mapping管理
映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程,下边是document和field与关系数据库的概念的类比:
elasticsearch | 关系数据库 |
---|---|
index(索引库) | database(数据库) |
type(类型) | table(表) |
document(文档) | row(记录) |
field(域) | column(字段) |
注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。
5.2.1 创建mapping
语法:
POST /index_name/type_name/_mapping
如:
POST /java06/course/_mapping
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
效果:
5.2.2.查询mapping
查询所有索引的映射:
GET /java06/course/_mapping
5.2.3.更新mapping
映射创建成功可以添加新字段,已有字段不允许更新。
5.2.4.删除mapping
通过删除索引来删除映射。
5.3.document管理
5.3.1.创建document
ES中的文档相当于MySQL数据库表中的记录。
5.3.1.1.POST语法
此操作为 ES 自动生成 id 的新增 Document 方式。
语法:
POST /index_name/type_name/id
如:
POST /java06/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"studymodel":"201002"
}
POST /java06/course
{
"name":".net从入门到放弃",
"description":".net程序员谁都不服",
"studymodel":"201003"
}
5.3.1.2.PUT语法
此操作为手工指定 id 的 Document 新增方式。
语法:PUT/index_name/type_name/id{field_name:field_value}
如:
PUT /java06/course/2
{
"name":"php从入门到放弃",
"description":"php是世界上最好的语言",
"studymodel":"201001"
}
结果:
{ "_index": "test_index", 新增的 document 在什么 index 中, "_type": "my_type", 新增的 document 在 index 中的哪一个 type 中。 "_id": "1", 指定的 id 是多少 "_version": 1, document 的版本是多少,版本从 1 开始递增,每次写操作都会+1 "result": "created", 本次操作的结果,created 创建,updated 修改,deleted 删除 "_shards": { 分片信息 "total": 2, 分片数量只提示 primary shard "successful": 1, 数据 document 一定只存放在 index 中的某一个 primary shard 中 "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
通过head查询数据:
5.3.2.查询document
语法:
GET /index_name/type_name/id
或
GET /index_name/type_name/_search?q=field_name:field_value
如:根据课程id查询文档
GET /java06/course/1
如:查询所有记录
GET /java06/course/_search
如:查询名称中包括php 关键字的的记录
GET /java06/course/_search?q=name:门
结果:
{
"took": 1, # 执行的时长。单位毫秒
"timed_out": false, # 是否超时
"_shards": { # shard 相关数据
"total": 1, # 总计多少个 shard
"successful": 1, # 成功返回结果的 shard 数量
"skipped": 0,
"failed": 0
},
"hits": { # 搜索结果相关数据
"total": 3, # 总计多少数据,符合搜索条件的数据数量
"max_score": 1, # 最大相关度分数,和搜索条件的匹配度
"hits": [# 具体的搜索结果
{
"_index": "java06",# 索引名称
"_type": "course", # 类型名称
"_id": "1",# id 值
"_score": 1, # 匹配度分数,本条数据匹配度分数
"_source": { # 具体的数据内容
"name": "php从入门到放弃",
"description": "php是世界上最好的语言",
"studymodel": "201001"
}, {
"_index": "java06",
"_type": "course",
"_id": "2",
"_score": 0.13353139,
"_source": {
"name": "php从入门到放弃",
"description": "php是世界上最好的语言",
"studymodel": "201001"
}
}, {
"_index": "java06",
"_type": "course",
"_id": "6ljFCnIBp91f7uS8FkjS",
"_score": 0.13353139,
"_source": {
"name": ".net从入门到放弃",
"description": ".net程序员谁都不服",
"studymodel": "201003"
}
}
]
}
}
5.3.3.删除Document
ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)
语法:
DELETE /index_name/type_name/id
如:
DELETE /java06/course/3
结果:
{
"_index": "java06",
"_type": "course",
"_id": "2",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
5.4.ES读写过程
5.4.1.documnet routing(数据路由)
当客户端创建document的时候,es需要确定这个document放在该index哪个shard上,这个过程就是document routing。
路由过程:
路由算法:shard = hash(5) %number_of_primary_shards
id:document的_id,可能是手动指定,也可能是自动生成,决定一个document在哪个shard上
number_of_primary_shards:主分片數量。
5.4.2.为什么primary shard数量不可变?
原因:假如我们的集群在初始化的时候有5个primary shard,我们往里边加入一个document id=5,假如hash(5)=23,这时该document 将被加入 (shard=23%5=3)P3这个分片上。如果随后我们给es集群添加一个primary shard ,此时就有6个primary shard,当我们GET id=5 ,这条数据的时候,es会计算该请求的路由信息找到存储他的 primary shard(shard=23%6=5) ,根据计算结果定位到P5分片上。而我们的数据在P3上。所以es集群无法添加primary shard,但是可以扩展replicas shard。
5.5.luke查看ES的逻辑结构
-
拷贝elasticsearch-6.2.3/data到windows
-
双击luke.bat,启动luke
-
使用luke打开data\nodes\0\indices路径
六.IK分词器
6.1.测试分词器
在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终找到词关联的文档。
测试当前索引库使用的分词器:
POST /_analyze
{
"text":"测试分词器,后边是测试内容:spring cloud实战"
}
结果如下:
会发现分词的效果将“测试”这个词拆分成两个单字“测”和“试”,这是因为当前索引库使用的分词器对中文就是单字分词。
6.2.中文分词器
6.2.1.Lucene自带中文分词器
StandardAnalyzer:
单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”, 效果:“我”、“爱”、“中”、“国”。
CJKAnalyzer
二分法分词:按两个字进行切分。如:“我是中国人”,效果:“我是”、“是中”、“中国”“国人”。
上边两个分词器无法满足需求。
SmartChineseAnalyzer
对中文支持较好,但扩展性差,扩展词库和禁用词库等不好处理
6.2.2.第三方中文分析器
paoding: 庖丁解牛最新版在 https://code.google.com/p/paoding/ 中最多支持Lucene 3.0,且最新提交的代码在 2008-06-03,在svn中最新也是2010年提交,已经过时,不予考虑。
IK-analyzer:最新版在https://code.google.com/p/ik-analyzer/上,支持Lucene 4.10从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。 但是也就是2012年12月后没有在更新。
6.3.安装IK分词器
使用IK分词器可以实现对中文分词的效果。
下载IK分词器:(Github地址:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.)
1、下载zip:
2、解压,并将解压的文件拷贝到ES安装目录的plugins下的ik(重命名)目录下,重启es
3、测试分词效果:
POST /_analyze
{
"text":"中华人民共和国人民大会堂",
"analyzer":"ik_smart"
}
6.4.两种分词模式
ik分词器有两种分词模式:ik_max_word和ik_smart模式。
1、ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民大会堂、人民、共和国、大会堂、大会、会堂等词语。
2、ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
6.5.自定义词库
如果要让分词器支持一些专有词语,可以自定义词库。
iK分词器自带的main.dic的文件为扩展词典,stopword.dic为停用词典。
也可以上边的目录中新建一个my.dic文件(注意文件格式为utf-8(不要选择utf-8 BOM))
可以在其中自定义词汇:
比如定义:
配置文件中 配置my.dic,
七.field详细介绍
上边章节安装了ik分词器,如何在索引和搜索时去使用ik分词器呢?如何指定field的类型?比如日期类型、数值类型等。
ES6.2核心的字段类型如下:
7.1.field的属性介绍
7.1.1.type:
通过type属性指定field的类型。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"name"</span>:{
<span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>
}</span></span>
7.1.2.analyzer:
通过analyzer属性指定分词模式。
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#aa1111">"name"</span>: {
<span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
<span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>
}</span></span>
上边指定了analyzer是指在索引和搜索都使用ik_max_word,如果单独想定义搜索时使用的分词器则可以通过 search_analyzer属性。 对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"name"</span>: {
<span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
<span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,<span style="color:red">#生成索引目录时</span>
<span style="color:#aa1111">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span><span style="color:red">#检索时</span>
}</span></span>
7.1.3.index:
通过index属性指定是否索引。 默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。 但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置 为false。 删除索引,重新创建映射,将pic的index设置为false,尝试根据pic去搜索,结果搜索不到数据
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"pic"</span>: {
<span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>,
<span style="color:#000000">"index"</span>:<span style="color:#221199">false</span>
}</span></span>
7.1.4.source:
如果某个字段内容非常多,业务里面只需要能对该字段进行搜索,比如:商品描述。查看文档内容会再次到mysql或者hbase中取数据,把大字段的内容存在Elasticsearch中只会增大索引,这一点文档数量越大结果越明显,如果一条文档节省几KB,放大到亿万级的量结果也是非常可观的。
如果只想存储某几个字段的原始值到Elasticsearch,可以通过incudes参数来设置,在mapping中的设置如下:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"_source"</span>: {
<span style="color:#000000">"includes"</span>:[<span style="color:#aa1111">"description"</span>]
}
}</span></span>
同样,可以通过excludes参数排除某些字段:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"_source"</span>: {
<span style="color:#000000">"excludes"</span>:[<span style="color:#aa1111">"description"</span>]
}
}</span></span>
7.2.常用field类型
7.2.1.text文本字段
例如: 1、创建新映射:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"_source"</span>: {
<span style="color:#000000">"includes"</span>:[<span style="color:#aa1111">"description"</span>]
}
<span style="color:#aa1111">"properties"</span>: {
<span style="color:#aa1111">"name"</span>: {
<span style="color:#aa1111">"type"</span>: <span style="color:#aa1111">"text"</span>,
<span style="color:#aa1111">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,
<span style="color:#aa1111">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span>
},
<span style="color:#aa1111">"description"</span>: {
<span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
<span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,
<span style="color:#000000">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span>
},
<span style="color:#aa1111">"pic"</span>:{
<span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>,
<span style="color:#000000">"index"</span>:<span style="color:#221199">false</span>
}
}
}</span></span>
2、插入文档:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">1</span>
{
<span style="color:#000000">"name"</span>:<span style="color:#aa1111">"python从入门到放弃"</span>,
<span style="color:#000000">"description"</span>:<span style="color:#aa1111">"人生苦短,我用Python"</span>,
<span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>
}</span></span>
3、查询测试:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">name</span>:<span style="color:#000000">放弃</span>
<span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">description</span>:<span style="color:#000000">人生</span>
<span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">pic</span>:<span style="color:#116644">250.</span><span style="color:#000000">jpg</span></span></span>
结果:name和description都支持全文检索,pic不可作为查询条件
7.2.2.keyword关键字字段
上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段往索引目录写时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。
例如: 1、更改映射:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"properties"</span>: {
<span style="color:#000000">"studymodel"</span>:{
<span style="color:#000000">"type"</span>:<span style="color:#aa1111">"keyword"</span>
}
}
}</span></span>
2、插入文档:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">2</span>
{
<span style="color:#000000">"name"</span>: <span style="color:#aa1111">"java编程基础"</span>,
<span style="color:#000000">"description"</span>: <span style="color:#aa1111">"java语言是世界第一编程语言"</span>,
<span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
<span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"2010年01月"</span>
}</span></span>
3、根据name查询文档:
<span style="background-color:#f8f8f8"><span style="color:#333333">GET /java06/course/_search?q=studymodel:2010年01月</span></span>
name是keyword类型,所以查询方式是精确查询。
7.2.3.date日期类型
日期类型不用设置分词器,通常日期类型的字段用于排序。 1)format 通过format设置日期格式,多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的
例如: 1、设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"properties"</span>: {
<span style="color:#000000">"timestamp"</span>: {
<span style="color:#000000">"type"</span>: <span style="color:#aa1111">"date"</span>,
<span style="color:#000000">"format"</span>: <span style="color:#aa1111">"yyyy-MM-dd"</span>
}
}
}</span></span>
2、插入文档:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">3</span>
{
<span style="color:#000000">"name"</span>: <span style="color:#aa1111">"spring开发基础"</span>,
<span style="color:#000000">"description"</span>: <span style="color:#aa1111">"spring 在java领域非常流行,java程序员都在用。"</span>,
<span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"201001"</span>,
<span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
<span style="color:#000000">"timestamp"</span>:<span style="color:#aa1111">"2018-07-04 18:28:58"</span>
}</span></span>
7.2.4.Numeric类型
es中的数字类型经过分词(特殊)后支持排序和区间搜索
例如: 1、更新已有映射:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
<span style="color:#000000">"properties"</span>: {
<span style="color:#000000">"price"</span>: {
<span style="color:#000000">"type"</span>: <span style="color:#aa1111">"float"</span>
}
}
} </span></span>
2、插入文档
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">3</span>
{
<span style="color:#000000">"name"</span>: <span style="color:#aa1111">"spring开发基础"</span>,
<span style="color:#000000">"description"</span>: <span style="color:#aa1111">"spring 在java领域非常流行,java程序员都在用。"</span>,
<span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"201001"</span>,
<span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
<span style="color:#000000">"price"</span>:<span style="color:#116644">38.6</span>
}</span></span>
7.3.field属性的设置标准
属性 | 标准 |
---|---|
type | 是否有意义 |
index | 是否搜索 |
source | 是否展示 |
7.4 field主要知识总结
1、field数据类型
文本:text、keyword(往索引目录写不进行分词)
数字:integer、long、float、double
2、field的属性
type:数据类型,如:text、long
analyzer:往索引目录写或搜索时的分词模式,如:analyzer=ik_max_word,analyzer=ik_smart
index:是否往索引目录写,如:true、false
_source:document中是否存储,如:includes,excludes
3、field属性的设置标注
属性 标准
type 分词是否有意义
index 是否搜索
_source 是否展示