elasticsearch入门基本知识+使用案例

1、ES逻辑结构

索引-index:相当于db中的数据库名。索引命名规则:小写字母。

类型-type:相当于数据库中的表名,为具有相同字段的文档定义的一个类型。

字段-field:相当于表字段名,文档数据的属性命名

映射-mapping:可以设置字段的数据类型、默认值、分析器、是否被索引等规则,是对文档的约束。常见的mapping属性包括:

type:字段数据类型,常见的简单类型有:

字符串:text(可分词的文本,与analyzer搭配使用)、keyword(精确值,不可分词,例如:国家名称、ip地址)

数值:long、integer、short、byte、double、float

布尔:boolean

日期:date

对象:object,嵌套子对象

index:是否创建索引,默认为true。当设置为false时,该字段不参与搜索

analyzer:分词器类型,ik_smart 粗粒度分词 ik_max_word 细粒度分词

properties:嵌套对象的字段定义

文档-document:相当于表中的一行数据,存在于index/type下面。文档以JSON格式存储,能够被索引

2、拓展ik分词器的词库,只需要修改ik分词器目录中的config/IKAnalyzer.cfg.xml文件:

去掉无效分词、新增词典设置、

ik_smart 粗粒度分词 ik_max_word 细粒度分词

3、DSL语法

创建索引库: PUT /索引库名

PUT /heima

{

"mappings": {

"properties": {

"info":{

"type": "text",

"index": true,

"analyzer": "ik_max_word" //创建分词,建立倒排索引(词根 -> 文档编号)

"search_analyzer": "pinyin" //搜索分词器,例如按照拼音分词做搜索

},

"email":{

"type": "keyword",

"index": false

},

"name":{

"type": "object",

"properties": {

"firstName":{

"type":"keyword"

},

"lastName":{

"type":"keyword"

}

}

}

}

}

}

查询索引库: GET /索引库名

GET /heima

删除索引库:

DELETE /索引库名

修改索引库: ES禁止修改索引库原有字段(原有字段可能会带有倒排索引),可以添加新的字段

PUT /索引库名/_mapping

{

"properties" :{

"新字段名" : {

type

index

}

}

}

添加文档:

POST /索引库名/_doc/文档ID

POST /heima/_doc/2

{

"info": "黑马程序员",

"email": "1256012967@qq.com",

"name": {

"firstName": "maoshun",

"lastName": "leng"

}

}

查询文档:

GET /索引库名/_doc/文档ID

删除文档:

DELETE /索引库名/_doc/文档ID

修改文档:

方式一:全量修改文档, PUT /索引名/_doc/文档ID,先删除旧文档,再新增文档。如果旧文档不存在,直接新增

方式二:增量修改-局部修改文档字段,POST /索引名/_update/文档ID,

POST /heima/_update/2

{

"doc": {

"email":"lengmaoshun@esunny.cc"

}

}

批量导入

数据查询基本语法:

GET /索引名称/_search

{

"query":{

"查询类型":{

"查询字段":"条件值"

}

}

}

查询类型有:

match_all:查询所有数据,查询条件为空

full text:全文检索查询,利用分词器对用户输入内容分词,然后去倒排索引库中匹配。查询类型有:

match:只能对一个字段进行查询

multi_match:可以对多个字段进行查询,只要有一个字段包含查询值,文档就能被查到。查询查询的字段越多,查询性能越差。可以把多个字段合并到一个字段做查询

精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期等类型字段,不会对搜索条件分词,精确查询。查询类型有:

ids

range:根据值范围查询

term:根据词条精确值查询

布尔查询是一个或多个查询子句的组合,子查询的组合方式有:

must:必须匹配每个子查询,类似 与

should:选择性匹配子查询,类似 或

must_node:必须不匹配,不参与算分,类似 非。不参与算分,查询速度快

filter:必须匹配,不参与算分,过滤出

查询:城市是上海,品种是皇冠假日、华美达,价格大于500,评分大于45的酒店

GET /hotel/_search

{

"query":

{

"bool":{

"must":[{"term":{"city":"上海"}}],

"should":[{"term":{"brand":"皇冠假日"}},{"term":{"brand":"华美达"}}],

"must_not":[{ "range":{"price":{ "lte":500 } }}],

"filter":[{ "range":{"score":{ "gte":45 } }}

}

}

}

分页查询:ES最多只能查询10000条数据

GET /hotel/_search

{

"query" {

"查询类型":{

"查询字段":"查询值"

}

}

"from": 0, //分页开始的下标,默认是0

"size": 10, //每页显示的个数

"sort":[

{"price","asc"}

]

}

高亮查询:把搜索中的关键字给高亮突出显示出来,不能用match_all。默认搜索字段与高亮字段必须一致才能高亮

GET /heima/_search

{

"query":

{

"match": {

"info": "黑马"

}

},

"highlight": {

"fields": {

"info": {

"pre_tags": "<em>",

"post_tags": "</em>"

},

// 搜索字段与高亮字段不一致也能高亮设置

"name.firstName": {

"require_field_match": "false"

}

}

}

}

聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类

桶(bucket)聚合:对文档分组

度量(metric)聚合:最大值、最小值、平均值

管道(pipeline)聚合:对其它聚合的结果再聚合

分词器分词执行三步骤:

character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符

tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik smarttokenizer

filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

同义词分词器:

PUT /testsyno

{

"settings": {

"analysis": {

"analyzer": {

"ik_syno_search_analyzer":{ // ik_syno_search_analyzer为自定义分词器名

"tokenizer":"ik_max_word",

"filter":[

"lowercase", //内置filter

"ik_syno_filer" //自定义filter

]

}

},

"filter": {

"ik_syno_filer":{

"type":"synonym_graph",

"updateable":true, //开启热加载同义词,当配置文件发生变化时,需要执行POST /testsyno/_reload_search_analyzers加载最新同义词

"synonyms_path":"analysis/synonyms.txt"

}

}

}

},

"mappings": {

"properties": {

"content":{

"type": "text",

"analyzer": "ik_max_word", //添加文档创建倒排索引时使用到的分词器

"search_analyzer": "ik_syno_search_analyzer" // 关键词搜索使用的分词器

}

}

}

}

POST /testsyno/_reload_search_analyzers

POST /testsyno/_analyze

{

"analyzer": "ik_syno_search_analyzer",

"text": "HELLO,china"

}

POST /testsyno/_doc/1

{

"content":"hello,我的小宝贝"

}

POST /testsyno/_doc/2

{

"content":"我爱你,中国"

}

GET /testsyno/_search

{

"query": {

"match": {

"content": "china"

}

}

}

自动补全分词器: 查询出以用户输入内容开头的词条

安装拼音分词器:

自定义分词器:

相关推荐
Dreams°1231 小时前
大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据·单元测试·可用性测试
sf_www1 小时前
Flink on YARN是如何确定TaskManager个数的
大数据·flink
infiniteWei1 小时前
【Lucene】原理学习路线
学习·搜索引擎·全文检索·lucene
武子康3 小时前
大数据-213 数据挖掘 机器学习理论 - KMeans Python 实现 距离计算函数 质心函数 聚类函数
大数据·人工智能·python·机器学习·数据挖掘·scikit-learn·kmeans
武子康3 小时前
大数据-214 数据挖掘 机器学习理论 - KMeans Python 实现 算法验证 sklearn n_clusters labels
大数据·人工智能·python·深度学习·算法·机器学习·数据挖掘
Aloudata4 小时前
NoETL自动化指标平台为数据分析提质增效,驱动业务决策
大数据·数据分析·指标平台·指标体系
2401_883041088 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
青云交8 小时前
大数据新视界 -- 大数据大厂之 Impala 性能优化:融合机器学习的未来之路(上 (2-1))(11/30)
大数据·计算资源·应用案例·数据交互·impala 性能优化·机器学习融合·行业拓展
Json_1817901448010 小时前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
Qspace丨轻空间13 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐