全手敲全文索引ElasticSearch基础知识点干货

双子孤狼 2021-03-09 10:15:37 ⋅ 855 阅读

原文:https://www.toutiao.com/i6936455750218826244

1. ElasticSearch是一个可扩展的分布式全文检索引擎,基于Lucene为核心,封装基础API,对外提供restfulAPI和javaAPI的简单操作方式。

2. Elaticsearch的一些核心概念

- 索引(Index),类似的数据放在一个索引,类似关系数据库的一个库

- 类型(Type),属于Index中的类别,可以看着关系数据库的一个表,ES7.X以后逐渐会移除这个概念

- 映射(Mapping),定义了每个字段的类型信息,类似关系表的表结构,包括text,keyword,number,array,range,boolean,date,geo_point,ip,nested,object

- 文档(Document),相当于关系数据库的一条记录

- 域(Field),相当于关系型数据库的一个字段

3. Elaticsearch集成IKAnalyzer,采用插件的方式,将对应的包存放在安装目录下plugins 目录下即可

4. IK分词器包括2种模式:ik_max_word(常用):将文档最细粒度拆分和ik_smart模式

5. IK分词器支持自定义扩展词库和停用词词库,在
plugins/analysis-ik/config 目录下新增xxx.dic并在IKAnalyzer.cfg.xml 中配置。

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
       <properties>
           <comment>IK Analyzer 扩展配置</comment>
           <!--用户可以在这里配置自己的扩展字典 -->
           <entry key="ext_dict">ext_dict.dic</entry>
           <!--用户可以在这里配置自己的扩展停止词字典-->
           <entry key="ext_stopwords">stop_dict.dic</entry>
       </properties>

6. IK同义词词典支持,在
/config/analysis-ik/synonym.txt 文件中创建同义词对逗号分隔(utf-8);在创建索引的时候通过filter配置同义词文档。

7. 注意:扩展词和停用词是在创建索引的时候使用,同义词是在检索索引的时候使用

8. 常用API

       #1.索引操作API
       #创建索引,settings就是索引库设置参数,比如分片,副本数等各种属性的设置
       PUT /索引名称
       {
           "settings": {
           "属性名": "属性值"
           }
       }
       #判断索引是否存在
       HEAD /索引名称
       #查看单个索引
       GET /索引名称
       #批量查看索引
       GET /索引名称1,索引名称2,索引名称3,...
       #查看所有索引
       GET _all
       #另外一种查看所有的索引
       GET /_cat/indices?v
       #打开索引
       POST /索引名称/_open
       #关闭索引
       POST /索引名称/_close
       #删除索引
       DELETE /索引名称1,索引名称2,索引名称3...
       #2.映射操作API
       #创建映射字段,type:text、long、short、date、integer、object,index:是否索引,
       #默认是,store:是否存储,默认是,analyzer:指定分词器
       PUT /索引库名/_mapping
       {
           "properties": {
               "字段名": {
                   "type": "类型", 
                   "index": true"store": true"analyzer": "分词器"
               }
           }
       }
       #查看单个映射关系
       GET /索引名称/_mapping
       #查看所有映射关系
       GET _mapping
       GET _all/_mapping
       #修改映射关系 注意:修改映射增加字段 做其它更改只能删除索引 重新建立映射
       PUT /索引库名/_mapping
       {
           "properties": {
               "字段名": {
                   "type": "类型",
                   "index": true"store": true"analyzer": "分词器"
               }
           }
       }
       #一般情况下是在新建索引的时候同时建立映射关系
       put /索引库名称
       {
           "settings":{
           	"索引库属性名":"索引库属性值"
           },
           "mappings":{
               "properties":{
                   "字段名":{
                   	"映射属性名":"映射属性值"
                   }
               }
           }
       }
       #3文档操作API
       #新增文档(手动指定id)
       POST /索引名称/_doc/{id}
       {
           "属性名称":"属性值",
           ....
       }
       #新增文档自动生成id
       POST /索引名称/_doc
       {
       	"field":"value"
       }
       #查看单个文档
       GET /索引名称/_doc/{id}
       #查看所有文档
       POST /索引名称/_search
       {
           "query":{
               "match_all": {
               }
           }
       }
       #返回指定的field
       POST /索引名称/_search/{id}?_source=field1,field2....
       #全部更新文档 把对应新增POST改为PUT即可,不过必须带上id,id对应的文档存在就更新
       #id对应的文档不存在就新增
       #ES全文档更新是先将原文档标记为删除,再新建一个,定期清理标记为删除的文档
       #局部更新,仅仅更新某个字段
       POST /索引名/_update/{id}
       {
           "doc":{
           	"field":"value"
           }
       }
       #删除文档 根据id进行删除
       DELETE /索引名/_doc/{id}
       #删除文档 根据查询条件进行删除
       POST /索引库名/_delete_by_query
       {
           "query": {
               "match": {
                   "字段名": "搜索关键字"
               }
           }
       }
       #删除所有文档
       POST 索引名/_delete_by_query
       {
           "query": {
           "match_all": {}
           }
       }

 

9. 映射属性类型支持很多种数据类型

- String类型

- text:可分词,不可参与聚合

- keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合

- Numerical数值类型

- 基本数据类型:long、integer、short、byte、double、float、half_float

- 浮点数的高精度类型:scaled_float

- Date:日期类型

- Array:数组类型,进行匹配时候,任意一个元素满足都认为满足,排序的话 升序用最小值,降序用最大值

- Object:对象

10. 动态映射,在新增文档的时候遇到不存在的field,ES提供了一种动态映射机制。通过映射属性dynamic 设置,有3个值:true:动态映射进去,false:忽略不存在的,strict :报错。可以全局配置,也可单个Field配置

11. ES提供了基于JSON的完整查询DSL(Domain Specific Language)来定义查询。包括叶子查询子句和复合查询子句。

        #基本语法 query代表一个查询对象,查询类型包括:match_all,match,term,range
        POST /索引库名/_search
        {
            "query":{
                "查询类型":{
                	"查询条件":"查询条件值"
                }
            }
        }

12. match查询,全文查询的标准查询,可以对一个字段进行模糊、短语查询,查询条件值可以接收text/numerical/dates,会先分词,在组织成一个boolean查询,可以通过operator指定bool组合or、and,默认是or

        POST /test/_search
        {
            "query":{
                "match":{
                    "title":"小米电视4A"
                }
        	}
        }
        POST /test/_search
        {
            "query":{
                "match":{
                    "title":"小米电视4A",
                    "operator": "and"
                }
        	}
        }
13. match_phrase 短语查询,查询用一个字段进行短语查询,可以指定analyzer,slop移动因子
        GET /lagou-property/_search
        {
            "query": {
                "match_phrase": {
                "title": "小米 4A",
                "slop": 2
                }
            }
        }

14. query_string查询,无须指定某个字段,而对文档全文进行匹配查询,同时也支持指定某些字段上查询

        # 默认 和 指定字段
        GET /test-property/_search
        {
            "query": {
                "query_string" : {
                	"query" : "2699"
                }
            }
        } 
        GET /test-property/_search
        {
            "query": {
                "query_string" : {
                "query" : "2699",
                "fields": [ "title","price"]
                }
            }
        }

15. multi_match多字段匹配搜索

        GET /test-property/_search
        {
            "query": {
            	"multi_match" : {
                    "query":"2699",
                    "fields": [ "title","price"]
               	}
            }
        }
        #还可以使用*匹配多个字段
        GET /test-property/_search
        {
            "query": {
                "multi_match" : {
                    "query":"http://image.test.com/12479622.jpg",
                    "fields": [ "title","ima*"]
                }
            }
        }

16. 词条(Term)查询,根据结构化数据中的精确值查找文档,与全文查询不同的是不分析词,需要完全匹配

17. 词条搜索(term query)

        POST /book/_search
        {
        	"query": {
            	"term" : { "name" : "solr" }
            }
        }

18. terms query 词条集合搜索,查询指定字段包含某些词项的文档

        GET /book/_search
        {
            "query": {
            	"terms" : { "name" : ["solr", "elasticsearch"]}
            }
        }

19. range query 范围查询 gte,gt,lte,lt,boost(查询权重)

        GET /book/_search
        {
            "query": {
                "range" : {
                    "price" : {
                        "gte" : 10,
                        "lte" : 200,
                        "boost" : 2.0
                    }
            	}
        	}
        }
        #时间戳范围查询
        GET /book/_search
        {
            "query": {
                "range" : {
                    "timestamp" : {
                        "gte" : "now-2d/d",
                        "lt" : "now/d"
                    }
                }
            }
        }
        #日期范围查询,format
        GET book/_search
        {
            "query": {
                "range" : {
                    "timestamp" : {
                        "gte": "18/08/2020",
                        "lte": "2021",
                        "format": "dd/MM/yyyy||yyyy"
                    }
                }
            }
        }

20. exists query 不为空查询,查询指定字段不为空的文档,相当于mysql中的column is not null

21. 词前缀搜索prefix

        GET /book/_search
        { 
            "query": {
            	"prefix" : { "name" : "so" }
            }
        }

22. wildcard 通配符查询

        GET /book/_search
        {
            "query": {
            	"wildcard" : { "name" : "so*r" }
            }
        }

23. 排序,相关性评分排序,默认情况下是最相关的文档排最前面。也可以指定排序字段

        POST /book/_search
        {
            "query": {
            	"match_all": {}
            },
            "sort": [
            	{"price": {"order": "desc"}}
            ]
        }
        #多级排序
        POST /book/_search
        {
            "query":{
            "match_all":{}
            },
            "sort": [
                { "price": { "order": "desc" }},
                { "timestamp": { "order": "desc" }}
            ]
        }
24. 分页
        POST /book/_search
        {
            "query": {
            	"match_all": {}
            },
            "size": 2,
            "from": 0
        }

25. 高亮

        #fields 指定需要高亮的字段
        POST /book/_search
        {
            "query": {
                "match": {
               	 	"name": "elasticsearch"
                }
            },
            "highlight": {
                "pre_tags": "<font color='pink'>",
                "post_tags": "</font>",
                "fields": [{"name":{}},{"description":{}}]
            }
        }

26. 文档批量操作 mget 减少多次查询带来的网络操作次数

        #不同索引批量查询
        GET /_mget
        {
            "docs" : [
                {
                "_index" : "book",
                "_id" : 1
                },
                {
                "_index" : "book2",
                "_id" : 2
                }
            ]
        }
        #统一索引
        GET /book/_mget
        {
            "docs" : [
                {
                "_id" : 2
                },
                {
                "_id" : 3
                }
            ]
        }
        #统一索引简化查询为
        POST /book/_search
        {
            "query": {
                "ids" : {
                	"values" : ["1", "4"]
                }
            }
        }

27. bulk批量增删改:将文档的增删改查一些列操作,通过一次请求全都做完。减少网络传输次数

        #基础语法
        POST /_bulk
        {"action": {"metadata"}}
        {"data"}
        #删除1,新增5,修改2
        POST /_bulk
        { "delete": { "_index": "book", "_id": "1" }} 
        { "create": { "_index": "book", "_id": "5" }}
        { "name": "test14","price":100.99 }
        { "update": { "_index": "book", "_id": "2"} }
        { "doc" : {"name" : "test"} }

delete:删除一个文档,主要一个json即可,删除的批量操作不需要请求体

create:强制创建,PUT /index/type/id/_create

index:普通的put操作,可以是创建文档也可以全量替换文档

update:局部更新。

实际情况bulk请求一次不要太大,否则一次性内存堆积很多数据,性能会下降,一般一次请求几千个操作、大小几M正好。1000-5000个文档,大小建议5-15MB.

28. 过滤器,Filter DSL,也是一种查询的方式,ES所有的查询都会触发相关度得分的计算,过滤器查询不会计算相关度得分,更快一些,另外过滤器可以缓存到内存中,在重复查询的时候会更快。

29. 过滤器基础语法,主要包含查询部分和过滤部分。

        POST /book/_search
        {
            "query": {
                "bool": {
                    "must": {
                    	"match_all": {}
                    },
                    "filter": {
                        "range": {
                            "price": {
                                "gte": 200,
                                "lte": 1000
                            }
                        }
                    }
                }
            }
        }

全部评论: 0

    我有话说:

    Elasticsearch基础介绍及索引原理分析

    Elasticsearch是一个Lucene支持的分布式文本检索引擎。针对大型数据集的索引与检索功能,Elasticsearch性能非常优越。当你有关于数据的附加属性且你能够知道具体需要查询的记录时

    Elasticsearch 7.9.3 发布

    Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决越来越多的用例。Elasticsearch 7.9.3 已经发布,本次更新信息如下: BUG 修复

    WebMIS 1.0.0 beta.3 发布,栈开发基础框架

    栈开发基础框架,包括 PHP / Python / SpringBoot / Phalcon / Flutter / NodeJS / Vue / Swoole / Redis / API 等技术

    搜索引擎技术选型调研:Elasticsearch与Solr

    Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的功能开源搜索引擎框架。

    阿里技术:自底向上构建知识图谱过程

    知识图谱的构建技术主要有自顶向下和自底向上两种。其中自顶向下构建是指借助百科类网站等结构化数据源,从高质量数据中提取本体和模式信息,加入到知识库里。

    Go语言社区系统 bbs-go 3.2.0 版本发布,支持基于 Elasticsearch 的帖子搜索

    更新内容 新功能:支持基于elasticsearch的帖子搜索功能 优化:SEO优化,支持神马搜索链接推送 优化:完善数据库初始化脚本 优化:优化日志输出逻辑,日志输出到文件时同时支持输出到控制台

    用户体验设计干货笔记

    赵煜 前滴滴资深体验设计师 7年互联网产品设计经验,链路体验+增长设计专家,曾负责滴滴拼车业务乘客侧效率革新工作、快车司乘评价体系优化工作、拼车新计价改革,业内首创“共乘”概念。深耕交互设计

    MySql实战篇:正确理解并使用MySql索引

    索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统......

    Micronaut 2.3.3,基于 JVM 的微服务应用框架

    Micronaut 是 Grails 框架作者打造的开源项目,也是新一代基于 JVM 的栈微服务框架,用于构建模块化的、易于测试的微服务应用。有关 Micronaut 的特性介绍此查看。 近日

    Micronaut 2.4.0 发布,基于 JVM 的微服务应用框架

    Micronaut 是 Grails 框架作者打造的开源项目,也是新一代基于 JVM 的栈微服务框架,用于构建模块化的、易于测试的微服务应用。有关 Micronaut 的特性介绍此查看。 近日

    Micronaut 2.4.2 发布,基于 JVM 的微服务应用框架

    Micronaut 是 Grails 框架作者打造的开源项目,也是新一代基于 JVM 的栈微服务框架,用于构建模块化的、易于测试的微服务应用。有关 Micronaut 的特性介绍此查看。 近日

    抖音品质建设 - iOS启动优化《原理篇》

    前言 启动是 App 给用户的第一印象,启动越慢用户流失的概率就越高,良好的启动速度是用户体验不可缺少的一环。启动优化涉及到的知识非常多面也很广,一篇文章难以包含全部,所以拆分成两部分:原理和实践

    Redis系列七 Debug Lua

      调试redis+lua 学了lua的基本语法,了解了redis+lua的配套用法,但是却不知道怎么断点调试。学就学全面, 官网中有dubug相关说明。地址:Redis Lua

    Elasticsearch 7.11.2 发布,提升缓存效率

    Elasticsearch 7.11.2 正式发布,此次更新内容如下: 增强 提高碎片级请求缓存效率 #69505 Bug 修复 聚合 修正用 doc_count 执行过滤器的过滤器

    Mac工具集

      MacTool Mac 开源免费工具汇总, 只罗列开源好用的。更列表请参考awesome-mac 必备 Homebrew - 体验通过命令行安装 Mac 软件的工具(大部分是

    深度好文!RocketMQ高级进阶知识精讲

    进阶高级的知识,在我们平时的面试中会用到,掌握了...