es后台启动命令:./bin/elasticsearch -d
kibana启动命令:nohup ./bin/kibana &
ik分词器
由于默认的分词器对中文并不是很好的支持,所以需要安装分词器(存储时会对文档进行分词,查询时也会对条件进行分词)一般中文使用IK分词器
IK分词器提供了两种分词策略:ik_smart(最少切分,粗粒度)和ik_max_word(最细切分,细粒度)
ik分词器插件安装:https://blog.csdn.net/FebruaryQ/article/details/131731715
验证使用ik分词器的结果:
POST /_analyze
{
"text":"黑马程序员学习java太棒了",
"analyzer":"ik_smart/ik_max_word"
}
可通过ik分词器的配置文件IKAnalyzer.cfg.xml添加拓展词典和停用词典来定义自己的分词策略(需要分词的和不需要分词的如的、了、啊等语气助词)还可以进行热更新可见官方文档
分词时机:存储和查询时进行分词
1、概述
elasticsearch是一款非常强大的分布式搜索引擎,主要负责数据的存储、搜索和分析;底层由Lucene实现,其是一个java语言的搜索引擎类库
kibana负责数据可视化;logstash和beats负责数据抓取
索引(index):相同类型的文档的集合,如用户索引、商品索引、订单索引等等(相当于数据库表)
文档(document):每条数据就是一个文档(相当于数据库表中的记录)格式为json
映射(mapping):索引中文档的字段约束信息(相当于数据表的结构约束)如字段名称,类型等等
字段(Field):文档中的字段(相当于数据库表中的列)
2、es采用倒排索引
词条(term):文档按照语义分成的词语,注:词条是唯一的不重复的
存储小米手机时其会被分成‘小米’和‘手机’词条并与其文档id进行关联进而存储
查找时会先对小米手机进行分词为‘小米’和‘手机’,之后根据词条查找符合条件的文档id后根据文档id获取其数据(这里的词条和文档id均存在索引)
正向索引概念:
基于文档id创建索引,查询词条时必须先找到文档而后判断是否包含词条。
倒排索引概念:
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档。
mapping属性:mapping是对索引库中文档的约束(包括字段的类型、是否创建倒排索引等等)常见如下:
(1)type:字段类型
a、字符串:text(可分词的文本)、keyword(精确值,如国家、品牌、ip地址、邮箱地址等)
b、数值:long、integer、short、byte、double、float
c、布尔:boolean
d、日期:date
e、对象:object
f、地理坐标类型
①geo_point:由纬度和经度确定一个点。例如 32.8752345,120.2981567
②geo_shape:由多个geo_point组成的复杂几何图形,如一条直线,“LINESTRING(-77.03635 38.897676,-77009051 38.889939)”
注意:没有数组类型,但是每个字段类型的值可以有多个如"socre":[99.1,99.3,98.5] score实际上需定义为float或double
(2)index:是否创建倒排索引,默认是true
(3)analyzer:使用哪种分词器,和text结合使用
(4)properties:该字段的子字段
(5)字段拷贝
可以使用copy_to属性将当前字段拷贝到指定字段,这样该拷贝字段就拥有了其他被拷贝字段的所有值,可用于多条件搜索,仅仅只是用于搜索而查询时不会查出来,如:
"all": {
"type": "text",
"analyzer": "ik_max_word"
},
"brand": {
"type": "keyword",
"copy_to": "all"
},
"name": {
"type": "keyword",
"copy_to": "all"
}
#测试分词器
POST /_analyze
{
"text":"程序员学习java太棒了",
"analyzer":"ik_max_word"
}
3、索引库操作
创建索引库
PUT /learn
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"email": {
"type": "keyword",
"index": "false"
},
"name": {
"type": "object",
"properties": {
"fitstname": {
"type": "keyword"
},
"lastname": {
"type": "keyword"
}
}
}
}
}
}
#查看索引库
GET /learn
#修改索引库。。注:索引库和mapping一旦创建无法修改,但是可以添加新的字段
PUT /learn/_mapping
{
"properties":{
"age": {
"type":