很详细,大家可以花点时间看看
目录
0 概念扫盲
elasticsearch
elastic stack(ELK)
Lucene
正向索引和倒排索引
正向索引
倒排索引
1. es概念
文档和字段:
索引和映射:
DSL:相当于mysql中的sql语句
2. es操作
2.1 mapping映射属性
type:字段的数据类型,常见的简单类型有
index: 是否创建索引(是否参与搜索),默认为true
analyzer: 使用哪种分词器
properties: 字段,可以在字段中嵌套字段
2.2 索引库的CRUD
2.3 文档操作
2.4 DSL条件查询分类
2.5.1 排序
2.5.2 分页
2.5.3 高亮:
全部查询条件示例总结
2.6 数据的聚合
2.7 自动补全 (后续
2.8 数据同步(后续
查询通用语法 :
GET /indexName/_search
{
"query": {
"查询类型": {
"查询条件": "条件值"
}
}
}
查询所有 :
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
GET /indexName/_search
{
"query": {
"multi_match": {
"query": "TEXT",
"fields": ["FIELD1", " FIELD12"]
}
}
}
// term查询
GET /indexName/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
// range查询
GET /indexName/_search
{
"query": {
"range": {
"FIELD": {
"gte": 10, // 这里的gte代表大于等于,gt则代表大于
"lte": 20 // lte代表小于等于,lt则代表小于
}
}
}
}
// geo_bounding_box查询
GET /indexName/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": { // 左上点
"lat": 31.1,
"lon": 121.5
},
"bottom_right": { // 右下点
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
// geo_distance 查询
GET /indexName/_search
{
"query": {
"geo_distance": {
"distance": "15km", // 半径
"FIELD": "31.21,121.5" // 圆心
}
}
}
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{"term": {"city": "上海" }}
],
"should": [
{"term": {"brand": "皇冠假日" }},
{"term": {"brand": "华美达" }}
],
"must_not": [
{ "range": { "price": { "lte": 500 } }}
],
"filter": [
{ "range": {"score": { "gte": 45 } }}
]
}
}
}
2.5 搜索结果处理
elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序。
普通字段排序: :
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": "desc" // 排序字段、排序方式ASC、DESC
}
]
}
地理坐标排序: :
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance" : {
"FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
"order" : "asc", // 排序方式
"unit" : "km" // 排序的距离单位
}
}
]
}
elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。elasticsearch中通过修改from、size参数来控制要返回的分页结果
from从第几个文档开始,size总共查询几个文档。类似于mysql中的 limit ? , ?
基本分页语法: :
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0, // 分页开始的位置,默认为0
"size": 10, // 期望获取的文档总数
"sort": [
{"price": "asc"}
深度分页语法:官方文档
常见分页实现方案:
from + size:
优点:支持随机翻页
缺点:深度分页问题,默认查询上限(from + size)是10000
场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
after search:
优点:没有查询上限(单次查询的size不超过10000)
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
scroll:
优点:没有查询上限(单次查询的size不超过10000)
缺点:会有额外内存消耗,并且搜索结果是非实时的
场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。
实现 :
GET /hotel/_search
{
"query": {
"match": {
"FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
}
},
"highlight": {
"fields": { // 指定要高亮的字段
"FIELD": {
"pre_tags": "", // 用来标记高亮字段的前置标签
"post_tags": "" // 用来标记高亮字段的后置标签
}
}
}
}
流程:
注意事项
2.6.1 种类
桶(Bucket)聚合:用来对文档做分组
– TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组
– Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
– Avg:求平均值
– Max:求最大值
– Min:求最小值
– Stats:同时求max、min、avg、sum等
管道(pipeline)聚合:其它聚合的结果为基础做聚合
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
总结很长时间,麻烦给个点赞吧!