原文: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
}
}
}
}
}
}
注意:本文归作者所有,未经作者允许,不得转载