1.什么是 restFul ?
定义:如果一个架构符合rest设计,就称这个架构为RestFul架构
RestFul 是一种软件架构风格
2.什么Rest?
REST其实是Fielding博士提出一种基于网络的软件架构设计风格,其英文全称是“Representational(表现层) State(状态) Transfer(传输|转化)”,翻译成中文为“表述性状态转移”。对REST更通俗的解释就是:它是软件架构的一种分类,我们把具有某一组特征的软件架构设计称之为REST Style。
Rest设计原则:
1.使用REST的URL替换传统URL请求
传统URL:http://localhost:8989/xxx/find?id=21
RestURL: http://localhost:8989/xxx/find/21/
2.使用Http四种动词对应服务器四种操作:CRUD 资源增删改查
HTTP动词: GET 查询获取资源 POST 更新操作 PUT 添加操作 DELETE 删除
全文检索
1.什么是全文检索
定义:全文检索是计算机程序通过扫描文章中的每一个词,对每个词建立一个索引,
指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程
Es中的重要概念
es 特点
1.只处理文本 不处理语义
2.搜索时不区分大小写
3。搜索结果存在相关度排序
索引操作
a.创建索引 PUT /索引名 注意:索引名必须全部由小写字母组成
b. 查看所有索引 GET _cat/indices?v
c. 查看所有索引 GET /索引名
d.删除索引 DELETE /索引名
e.删除所有所有索引 DELETE/*
2.创建索引(Index)和类型(type)和映射(mapping) 注意?:在 6.x一个索引只能创建一个索引
类型(type):keywrod|text|ip|boolean|interger|long|double|date
PUT /ems
{
"mappings": {
"emp":{
"properties": {
"id":{"type":"keyword"},
"name":{"type":"keyword"},
"age":{"type": "integer"},
"bir":{"type": "date"}
}
}
}
}
3.查看索引类型和映射
GET /索引名/_mapping
GET /ems/_mapping
4.文档操作
添加手动指定_id
PUT /ems/emp/1
{
"id":"123",
"name":"张三",
"age":33,
"bir": "2018-01-13"
}
添加自动生成_id
POST /ems/emp
{
"id":"123",
"name":"张三",
"age":33,
"bir": "2018-01-13"
}
查询文档
GET /ems/emp/_id的值
更新文档
//第一种方式 跟新原有的数据
POST /dangdang/book/1/_update
{
"doc":{
"name":"小白杨故事123"
}
}
//第二 种方式 添加新的数据
POST /dangdang/book/1/_update
{
"doc":{
"name":"小白杨故事123",
"dec":"sdsd"
}
}
//第三种 在原来的基础上更新
POST /dangdang/book/1/_update
{
"script": "ctx._source.price+=5.5"
}
删除文档
DELETE /dangdang/book/1
批量操作(每个操作互不影响)
POST /dangdang/book/_bulk
{"index":{"_id":"5"}}
{"name":"zhangssan","content":"this is good zhangsan","price":76.9,"update":"2019-07-09"}
{"delete":{"_id":"5"}}
{"index":{}}
{"name":"lisi","content":"this is good lisi","price":76.9,"update":"2019-7-09"}
{"update":{"_id":"1"}}
{"doc":{"name":"ss"}}
ES 官方提供两种检索方式
a.使用URL参数形式进行检索(query as a paremeter)
b.使用DSL(特殊领域查询语言)方式(Request Body) 方式检索
测试数据
PUT /ems
{
"mappings": {
"emp":{
"properties": {
"name":{"type": "keyword"},
"age":{"type": "integer"},
"bir":{"type": "date"},
"content":{"type": "text"},
"address":{"type": "keyword"}
}
}
}
}
PUT /ems/emp/_bulk
{"index":{}}
{"name":"王小黑","age":24,"bir":"2012-12-12","content":"深刻的思考","address":"北京"}
{"index":{}}
{"name":"张小五","age":8,"bir":"2012-12-12","content":"女外恐怕怕【我","address":"北京"}
{"index":{}}
{"name":"哇in","age":9,"bir":"2012-12-12","content":"拍了的方式","address":"北京"}
{"index":{}}
{"name":"超长线","age":43,"bir":"2012-12-12","content":"米宽","address":"北京"}
{"index":{}}
{"name":"小黑","age":23,"bir":"2012-12-12","content":"未开放闲着一款吗mvc框架","address":"北京"}
1.URL 检索方式
GET /ems/emp/_search?q=* //查询所有
执行结果
{
"took": 17,//执行时间 17毫秒
"timed_out": false,//是否超时
"_shards": {//分片 es 默认是以集群方式 ,
"total": 5,//默认 是5个主分片 ,5个主分片组合到一起,是个完整的数据,每一个分片可以独立检索
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {//击中的总数
"total": 5,//总数
"max_score": 1,//最大得分
"hits": [
{
"_index": "ems",
"_type": "emp",
"_id": "xvWNPXQBPT1o2SdnaypZ",
"_score": 1,
"_source": {
"name": "哇in",
"age": 9,
"bir": "2012-12-12",
"content": "拍了的方式",
"address": "北京"
}
},
{
"_index": "ems",
"_type": "emp",
"_id": "w_WLPXQBPT1o2Sdnoyrk",
"_score": 1,
"_source": {
"name": "小黑",
"age": 23,
"bir": "2012-12-12",
"content": "未开放闲着一款吗mvc框架",
"address": "北京"
}
},
{
"_index": "ems",
"_type": "emp",
"_id": "xPWNPXQBPT1o2SdnaypY",
"_score": 1,
"_source": {
"name": "王小黑",
"age": 24,
"bir": "2012-12-12",
"content": "深刻的思考",
"address": "北京"
}
},
{
"_index": "ems",
"_type": "emp",
"_id": "xfWNPXQBPT1o2SdnaypZ",
"_score": 1,
"_source": {
"name": "张小五",
"age": 8,
"bir": "2012-12-12",
"content": "女外恐怕怕【我",
"address": "北京"
}
},
{
"_index": "ems",
"_type": "emp",
"_id": "x_WNPXQBPT1o2SdnaypZ",
"_score": 1,
"_source": {
"name": "超长线",
"age": 43,
"bir": "2012-12-12",
"content": "米宽",
"address": "北京"
}
}
]
}
}
排序并分页
GET /ems/emp/_search?q=*&sort=age:desc&size=2
参量
URI中允许的参数是:
名称 | 描述 |
---|---|
q | 查询字符串(映射到query_string 查询,请参阅 查询字符串查询以获取更多详细信息)。 |
df | 在查询中未定义任何字段前缀时使用的默认字段。 |
analyzer | 分析查询字符串时要使用的分析器名称。 |
analyze_wildcard | 是否应分析通配符和前缀查询。默认为false 。 |
batched_reduce_size | 分片结果的数量应在协调节点上立即减少。如果请求中的分片数量可能很大,则此值应用作保护机制以减少每个搜索请求的内存开销。 |
default_operator | 要使用的默认运算符可以是AND 或 OR 。默认为OR 。 |
lenient | 如果设置为true,将导致忽略基于格式的错误(例如,向数字字段提供文本)。默认为false。 |
explain | 对于每个匹配,请说明如何计算匹配得分。 |
_source | 设置为false 禁用_source 字段检索。您还可以使用_source_include &检索文档的一部分_source_exclude ( 有关更多详细信息,请参见请求正文文档) |
stored_fields | 每次命中将返回的文档的选择性存储字段,以逗号分隔。不指定任何值将导致不返回任何字段。 |
sort | 排序执行。可以采用fieldName 或 fieldName:asc / 的形式fieldName:desc 。fieldName可以是文档中的实际字段,也可以是特殊_score 名称以指示基于得分的排序。可以有几个sort 参数(顺序很重要)。 |
track_scores | 排序时,设置为true 以便仍跟踪分数并将其作为每次命中的一部分返回。 |
track_total_hits | 设置为false ,以禁用跟踪与查询匹配的总点击数。(有关更多详细信息,请参见索引排序)。默认为true。 |
timeout | 搜索超时,将搜索请求限制为在指定的时间值内执行,并保全过期时累积到该点的匹配。默认为无超时。 |
terminate_after | 为每个分片收集的最大文档数,达到该数量时,查询执行将提前终止。如果设置,则响应将具有布尔值字段,terminated_early 以指示查询执行是否实际上已终止。默认为no terminate_after。 |
from | 从匹配的索引开始到返回。默认为0 。 |
size | 返回的点击数。默认为10 。 |
search_type | 要执行的搜索操作的类型。可以是 dfs_query_then_fetch 或query_then_fetch 。默认为query_then_fetch 。有关可以执行的不同搜索类型的更多详细信息,请参见 搜索类型。 |
allow_partial_search_results | false 如果请求将产生部分结果,则设置为返回整体失败。默认值为true,这将在超时或部分失败的情况下允许部分结果。 |
2.DSL 检索方式
1.查询所有(match_all)
GET /ems/emp/_search
{
"query": {"match_all": {}}
}
2.查询所有返回指定条数(size)
GET /ems/emp/_search
{
"query": {"match_all": {}},
"size": 4
}
3.分页(from)
GET /ems/emp/_search
{
"query": {"match_all": {}},
"size": 2,
"from": 1 (pageno-1)*pagesaize
}
4.排序(sort)
GET /ems/emp/_search
{
"query": {"match_all": {}},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"size": 2,
"from": 0
}
5.查询结果中返回指定字段(_source)
GET /ems/emp/search
{
"query": {"match_all": {}},
"_source": ["name","age"]
}
6.关键词查询(term)
GET /ems/emp/_search
{
"query": {
"term": {
"age": {
"value": "24"
}
}
}
}
总结:
通过使用term得知,第一个除了text类型以外的所有类型均不分词
第二个ES默认使用的标准分词器(英文单词分词 中文单字分词)
7.范围查询(range)
GET /ems/emp/_search
{
"query": {
"range": {
"age": {
"gte": 10, gte//大于等于 gt//大于
"lte": 55 lte //小于等于 lt//小于
}
}
}
}
8.前缀查询(prefix)
GET /ems/emp/_search
{
"query": {
"prefix": {
"name": {
"value": "小"
}
}
}
}
9.通配符查询(wildcard)
* 表示零到多个字符
? 表示一个字符
GET /ems/emp/_search
{
"query": {
"wildcard": {
"name": {
"value": "王*黑"
}
}
}
}
10.多id查询(ids)
GET /ems/emp/_search
{
"query": {
"ids": {
"values": ["xPWNPXQBPT1o2SdnaypY","w_WLPXQBPT1o2Sdnoyrk"]
}
}
}
11.模糊查询(fuzzy)
fuzzy关键字:用来模糊查询含有指定关键字的文档,注意:允许出现的错误必须在0-2之间
GET /ems/emp/_search
{
"query": {
"fuzzy": {
"content": "vvc" //正确 mvc
}
}
}
#注意:最大编辑距离为 0 1 2
如果关键词为2长度 0..2 必须完全匹配
如歌关键词长度为3..5之间 允许一个错误
如歌关键词长度>5 最多允许两个错误
12.布尔查询(bool)
bool 关键字:用来组合多条件实现复杂查询
must:相当于&&同时成立
should :相当于|| 成立一个就行
must_not :相当于!不能满足任何一个
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{"wildcard": {
"content": {
"value": "s*"
}
}}
],
"must_not": [
{
"ids": {
"values": ["xPWNPXQBPT1o2SdnaypY"]
}
}
]
}
}
}
13.多字段查询(multi_match)
注意:使用这种方式进行查询是为了更好获取结果,在查询过程中先将查询条件根据当前的分词器分词之后进行查询
GET /ems/emp/_search
{
"query": {
"multi_match": {
"query": "中国",
"fields": ["name","content"] # 这里写要检索的指定字段
}
}
}
14.多字段分词查询(query_string)
注意:使用这种方式进行查询是为了更好获取结果,在查询过程中先将查询条件根据当前的分词器分词之后进行查询
GET /ems/emp/_search
{
"query": {
"query_string": {
"query": "中国声音",
"fields": ["name","content"],
"analyzer": "standard"//指定分词器
}
}
}
15.高亮查询
GET /ems/emp/_search
{
"query": {
"term": {
"content": {
"value": "框"
}
}
},
"highlight": {
"fields": {"*": {}},
"pre_tags": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"require_field_match":false
}
}
执行结果
{
"took": 81,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.89787805,
"hits": [
{
"_index": "ems",
"_type": "emp",
"_id": "w_WLPXQBPT1o2Sdnoyrk",
"_score": 0.89787805,
"_source": {
"name": "小黑",
"age": 23,
"bir": "2012-12-12",
"content": "未开放闲着一款吗mvc框架",
"address": "北京"
},
"highlight": {
"content": [
"未开放闲着一款吗mvc<span style='color:red'>框</span>架"
]
}
}
]
}
}
es 索引器的原理
分词器
ik分词器plugin方式安装
进入elasticsearch的bin路径,执行如下命令:
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
执行完后,重启elasticsearch,ik安装完毕。
查看测试分词器
GET _analyze
{
"analyzer": "ik_max_word",
"text": "redis 非常好用"
}
在mapping中使用ik分词器
"properties":{
"name":{
"type":"text",
"analyzer":"ik_max_word|ik_smart"
}
}
ik中自定一扩展词和停用词
ES中的查询
filter query语法
term过滤
GET /dangdang/book/_search
{
"query": {
"bool": {
"must": [
{"term": {
"content": {
"value": "小红"
}
}}
],
"filter": {
"term": {
"sex": "女"
}
}
}
}
}
terms
GET /dangdang/book/_search
{
"query": {
"bool": {
"must": [
{"term": {
"content": {
"value": "小红"
}
}}
],
"filter": {
"terms": {
"content":[
"小",
"书"
]
}
}
}
}
}
range范围查询
GET /dangdang/book/_search
{
"query": {
"bool": {
"must": [
{"term": {
"content": {
"value": "小红"
}
}}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 30
}
}
}
}
}
}
exsts filter
过滤存在指定字段,获取字段不为空的索引记录使用
GET /dangdang/book/_search
{
"query": {
"bool": {
"must": [
{"term": {
"content": {
"value": "小红"
}
}}
],
"filter": {
"exists": {
"field": "name"
}
}
}
}
}
ids
GET /dangdang/book/_search
{
"query": {
"bool": {
"must": [
{"term": {
"content": {
"value": "小红"
}
}}
],
"filter": {
"ids": {
"values": [
"10","20"
]
}
}
}
}
}
spring boot spring data 整合
应用场景
代码地址:https://gitee.com/zhanchengyang/learning