elasticsearch基础

1.核心概念

  1. 索引
    类似的数据放在一个索引,非类似的数据放不同索引, 一个索引也可以理解成一个关系型数据
    库。

  2. 类型
    代表document属于index中的哪个类别(type)也有一种说法一种type就像是数据库的表,
    比如dept表,user表。
    注意ES每个大版本之间区别很大:
    ES 5.x中一个index可以有多种type。
    ES 6.x中一个index只能有一种type。
    ES 7.x以后 要逐渐移除type这个概念。

  3. 映射
    mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构。
    常用数据类型:text、keyword、number、array、range、boolean、date、geo_point、ip、nested、object

2.基础操作

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

2.1 索引操作

2.1.1 创建索引

PUT /索引名称 
{ "settings": { "属性名": "属性值" } }

2.1.2 判断索引是否存在

HEAD /索引名称

2.1.3 查看索引

GET /索引名称

2.1.4 批量查看索引

GET /索引名称1,索引名称2,索引名称3,...

2.1.5 关闭索引

POST /索引名称/_close

2.1.6 打开索引

POST /索引名称/_open

2.1.7 删除索引

DELETE /索引名称

2.2 映射操作

2.2.1 创建映射字段

PUT /索引库名/_mapping 
{
	"properties": {
		"字段名": {
			"type": "类型",
			"index": true"store": true"analyzer": "分词器"
		}
	}
}

字段名:任意填写,下面指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:指定分词器

2.2.2 查看映射字段

GET /索引名称/_mapping

2.2.3 一次性创建索引和映射字段

put /索引库名称 
{
	"settings": {
		"索引库属性名": "索引库属性值"
	},
	"mappings": {
		"properties": {
			"字段名": {
				"映射属性名": "映射属性值"
			}
		}
	}
}

2.3 文档操作

2.3.1 新增文档(手动指定id)

POST /lagou-company-index/_doc/1 
{
	"name": "百度",
	"job": "小度用户运营经理",
	"payment": "30000",
	"logo": "http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbU AABJB7x9sm8374.png"
}

2.3.2 新增文档(自动生成id)

POST /索引名称/_doc
{ "field":"value" }

2.3.3 查看单个文档

GET /索引名称/_doc/{id}

2.3.4 查看所有文档

POST /索引名称/_search 
{
	"query": {
		"match_all": {}
	}
}

2.3.5 _source定制返回结果

GET /lagou-company-index/_doc/1?_source=name

2.3.6 更新文档(全部)

PUT /索引/_doc/{id}
{
	"name": "百度",
	"job": "小度用户运营经理",
	"payment": "30000",
	"logo": "http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbU AABJB7x9sm8374.png"
}

2.3.7 更新文档(局部)

POST /索引名/_update/{id} 
{ 
	"doc":{ 
		"field":"value" 
	} 
}

2.3.8 删除文档

DELETE /索引名/_doc/{id}

query DSL

Elasticsearch提供了基于JSON的完整查询DSL(Domain Specific Language 特定域的语言)来定义查
询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:

  • 叶子查询子句
    叶子查询子句 在特定域中寻找特定的值,如 match,term或 range查询。
  • 复合查询子句
    复合查询子句包装其他叶子查询或复合查询,并用于以逻辑方式组合多个查询(例如 bool或dis_max查询),或更改其行为(例如 constant_score查询)。

查询所有(match_all query)

POST /lagou-company-index/_search 
{ 
	"query":{ "
		match_all": {} 
	} 
}
  • query : 代表查询对象
  • match_all : 代表查询所有

全文检索

全文搜索能够搜索已分析的文本字段,如电子邮件正文,商品描述等

匹配搜索

全文查询的标准查询,它可以对一个字段进行模糊、短语查询。 match queries 接收text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组合操作(or、and 默认是 or )。

  • or 关系
    match 类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
POST /lagou-property/_search 
{ 
	"query":{ 
		"match":{ "title":"小米电视4A" } 
	} 
}
  • and 关系
    某些情况下,我们需要更精确查找,我们希望这个关系变成 and ,可以这样做:
POST /lagou-property/_search 
{
	"query": {
		"match": {
			"title": {
				"query": "小米电视4A",
				"operator": "and"
			}
		}
	}
}

短语搜索(match phrase query)

GET /lagou-property/_search 
{
	"query": {
		"match_phrase": {
			"title": "小米电视"
		}
	}
}
GET /lagou-property/_search 
{
	"query": {
		"match_phrase": {
			"title": "小米 4A"
		}
	}
}
GET /lagou-property/_search 
{
	"query": {
		"match_phrase": {
			"title": {
				"query": "小米 4A",
				"slop": 2
			}
		}
	}
}

query_string 查询

Query String Query提供了无需指定某字段而对文档全文进行匹配查询的一个高级查询,同时可以指定在哪些字段上进行匹配。

# 默认 和 指定字段 
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "2699"
		}
	}
}
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "2699",
			"default_field": "title"
		}
	}
}
# 逻辑查询 
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "手机 OR 小米",
			"default_field": "title"
		}
	}
}
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "手机 AND 小米",
			"default_field": "title"
		}
	}
}
# 模糊查询 
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "大米~1",
			"default_field": "title"
		}
	}
}
# 多字段支持 
GET /lagou-property/_search 
{
	"query": {
		"query_string": {
			"query": "2699",
			"fields": ["title", "price"]
		}
	}
}

词条级搜索

可以使用term-level queries根据结构化数据中的精确值查找文档。结构化数据的值包括日期范围、IP地址、价格或产品ID。
与全文查询不同,term-level queries不分析搜索词。相反,词条与存储在字段级别中的术语完全匹配。

词条搜索

term 查询用于查询指定字段包含某个词项的文档

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

词条集合搜索(terms query)

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

范围搜索

  • 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"
			}
		}
	}
}
GET book/_search 
{
	"query": {
		"range": {
			"timestamp": {
				"gte": "18/08/2020",
				"lte": "2021",
				"format": "dd/MM/yyyy||yyyy"
			}
		}
	}
}

不为空搜索(exists query)

查询指定字段值不为空的文档。相当 SQL 中的 column is not null

GET /book/_search 
{
	"query": {
		"exists": {
			"field": "price"
		}
	}
}

词项前缀搜索(prefix query)

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

通配符搜索(wildcard query)

GET /book/_search 
{
	"query": {
		"wildcard": {
			"name": "so*r"
		}
	}
}
GET /book/_search 
{
	"query": {
		"wildcard": {
			"name": {
				"value": "lu*",
				"boost": 2
			}
		}
	}
}

正则搜索(regexp query)

regexp允许使用正则表达式进行term查询.注意regexp如果使用不正确,会给服务器带来很严重的性能压力。比如.*开头的查询,将会匹配所有的倒排索引中的关键字,这几乎相当于全表扫描,会很慢。因此如果可以的话,最好在使用正则前,加上匹配的前缀。

GET /book/_search 
{
	"query": {
		"regexp": {
			"name": "s.*"
		}
	}
}
GET /book/_search 
{
	"query": {
		"regexp": {
			"name": {
				"value": "s.*",
				"boost": 1.2
			}
		}
	}
}

模糊搜索(fuzzy query)

GET /book/_search 
{
	"query": {
		"fuzzy": {
			"name": "so"
		}
	}
}
GET /book/_search 
{
	"query": {
		"fuzzy": {
			"name": {
				"value": "so",
				"boost": 1.0,
				"fuzziness": 2
			}
		}
	}
}
GET /book/_search 
{
	"query": {
		"fuzzy": {
			"name": {
				"value": "sorl",
				"boost": 1.0,
				"fuzziness": 2
			}
		}
	}
}

ids搜索(id集合查询)

GET /book/_search 
{
	"query": {
		"ids": {
			"type": "_doc",
			"values": ["1", "3"]
		}
	}
}

复合搜索

1) constant_score query

用来包装另一个查询,将查询匹配的文档的评分设为一个常值

GET / book / _search 
{
	"query": {
		"term": {
			"description": "solr"
		}
	}
}
GET / book / _search 
{
	"query": {
		"constant_score": {
			"filter": {
				"term": {
					"description": "solr"
				}
			},
			"boost": 1.2
		}
	}
}

2)布尔搜索

bool 查询用bool操作来组合多个查询字句为一个查询。 可用的关键字:

  • must:必须满足
  • filter:必须满足,但执行的是filter上下文,不参与、不影响评分
  • should:或
  • must_not:必须不满足,在filter上下文中执行,不参与、不影响评分
POST / book / _search 
{
	"query": {
		"bool": {
			"must": {
				"match": {
					"description": "java"
				}
			},
			"filter": {
				"term": {
					"name": "solr"
				}
			},
			"must_not": {
				"range": {
					"price": {
						"gte": 200,
						"lte": 300
					}
				}
			},
			"minimum_should_match": 1,
			"boost": 1.0
		}
	}
}

minimum_should_match代表了最小匹配精度,如果设置minimum_should_match=1,那么should语句中至少需要有一个条件满足。

排序

相关性评分排序

默认情况下,返回的结果是按照 相关性 进行排序的——最相关的文档排在最前。 为了按照相关性来排序,需要将相关性表示为一个数值。在Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序,按照相
关性评分升序排序如下

POST /book/_search 
{
	"query": {
		"match": {
			"description": "solr"
		}
	}
}
POST /book/_search 
{
	"query": {
		"match": {
			"description": "solr"
		}
	},
	"sort": [{
		"_score": {
			"order": "asc"
		}
	}]
}

字段值排序

POST / book / _search 
{
	"query": {
		"match_all": {}
	},
	"sort": [{
		"price": {
			"order": "desc"
		}
	}]
}

多级排序

假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:

POST / book / _search 
{
	"query": {
		"match_all": {}
	},
	"sort": [{
		"price": {
			"order": "desc"
		}
	}, {
		"timestamp": {
			"order": "desc"
		}
	}]
}

分页

POST / book / _search 
{
	"query": {
		"match_all": {}
	},
	"size": 2,
	"from": 0
}
POST / book / _search 
{
	"query": {
		"match_all": {}
	},
	"sort": [{
		"price": {
			"order": "desc"
		}
	}],
	"size": 2,
	"from": 2
}

size:每页显示多少条
from:当前页起始索引, int start = (pageNum - 1) * size

高亮

POST / book / _search 
{
	"query": {
		"match": {
			"name": "elasticsearch"
		}
	},
	"highlight": {
		"pre_tags": "<font color='pink'>",
		"post_tags": "</font>",
		"fields": [{
			"name": {}
		}]
	}
}
POST / book / _search 
{
	"query": {
		"match": {
			"name": "elasticsearch"
		}
	},
	"highlight": {
		"pre_tags": "<font color='pink'>",
		"post_tags": "</font>",
		"fields": [{
			"name": {}
		}, {
			"description": {}
		}]
	}
}
POST / book / _search 
{
	"query": {
		"query_string": {
			"query": "elasticsearch"
		}
	},
	"highlight": {
		"pre_tags": "<font color='pink'>",
		"post_tags": "</font>",
		"fields": [{
			"name": {}
		}, {
			"description": {}
		}]
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值