es

Elasticsearch即es,是一个分布式、RESTful 风格 json存储 的搜索和数据分析引擎,能够解决不断涌现出的各种查询 个人理解,es就一查询功能强大一点的文档数据库,后端一般的做法是将数据写入数据库后同步一份到es,供快速查询,官方不建议直接做数据库 java之前用redis,momeryCache做搜索优化的,现在都改用es了

参考:https://www.letianbiji.com/elasticsearch/,https://xiaoxiami.gitbook.io/elasticsearch/

增删改查

可也使用RESTful 风格的api,也可以使用一些在post请求后面带上 _[get,mget,search,bluk],实现查询修改

分词器

  • 内置分词器:

索引配置

  • mapping
  • 分词相关
  • 联表
    • 嵌套
    • 父子id
    • 业务自联
  • null_value,空值替换,仅用于倒排打分,不会替换_source的值

查询条件

  • term 词条查询
    • 查询数字,布尔值,时间时直接匹配
    • 查询text时,根据倒排的后的词条查询
    • **查询keywork时,直出即 = **
  • range 查询
    • 数字范围
    • 时间范围
    • age >= 0
    	"range":{
    		"age":{
    			"from":0,
    			"to":null
    		}
    	}
    
  • 模糊搜索
    • 前缀
    • 通配符
    • 正则
  • 全文检索查询
    • match
  • 判断是否为null,下面是不为null的,为null改为must_not即可
"must" : [
		{
		  "exists" : {
			"field" : "earnestDate",
			"boost" : 1.0
		  }
		}]

排序

  • es默认是按照打分排序的
  • 可以在查询中指定 sort
"sort": [
    {
      "date": {
        "order": "asc"
      }
    }
  ]

分页,from = offset

"from":0,
"size":20

聚合

  • 其实蛮复杂的
{
    "size":0, //不显示查询原数据
    "aggs":{
        "gruop_by_name":{   //gruop_by_name 聚合命名可以自己用,桶聚合的时候buckets_path需要用到
            "terms":{
                "field":"name.keyword"  //根据name groupby
            },
            "aggs":{
                "max_age":{
                    "max":{
                         "field":"age"  //最大age
                    }
                }
                
            }
        },
        "sum_all":{
            "sum_bucket":{
                "buckets_path":"gruop_by_name>max_age"  //对聚合后的bucket进行再计算
            }
        }
        
    }
}

es在springBoot中的使用

chrome插件

  • 推荐 Elasticvue,该有的功能都有,虽然提示不是太全

docker安装es

  • docker desktop现在居然收费了,并且找不到代替品,真TM。。。
  • 试了不指定版本拉不下来,最新版本也拉不下来,只能拉7.14.1
docker pull elasticsearch:7.14.1
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -e discovery.type=single-node elasticsearch:7.14.1