es Elasticsearch 十二 Es 搜索入门 Query stirng search 查询短语搜索 Query string 基础语法 query DSL Scroll 分批查询 滚动搜索
目录
Query stirng search 查询短语搜索
超时机制
Multi-index 多索引搜索
分页搜索
Query string 基础语法
正向搜索
逆向搜索
_all全查 不指定字段直接查询匹配
query DSL
//全文检索简单写法
相关度评分算法
Dsl语法
过滤器增加查询条件 不参与匹配评分 filter
查询计划 可用来定位错误语法
只过滤不搜索
过滤后自定义排序
Text字段排序问题
Scroll 分批查询 滚动搜索技术
一分钟搜索
第一排完后有一个 _scroll_id 之后的查询带上这个id查询
Scoll 应用场景
Ess 搜索入门
Query stirng search 查询短语搜索
Get book/_search
Took 耗时
Timed_out 是否超时
_shards 到几个分片搜索 成功几个跳过几个失败几个
Hits.total 查询结果数量
Max_score 最高分
Hits 数据
_source 查询相关度分
Hits.hits 详细数据
//加查询条件
get /myindex/_search?q=tccsssse=中
//加排序
get /myindex/_search?q=tccsssse=is&sort=tccsssse:desc
超时机制
一亿数据 1小时查完 设置超时1毫秒 ,查询1毫秒插到10调数据直接返回
- 搜索时候,请求必定跨所有主分片
- 数据量太大时候,搜索完毕每个分片需要一个多小时
- 用户不相等,丢失业务
- &timeout=10ms
也可以增加全局设置 超时机制,特殊情况设置 不常用
Timeout机制
指定每个shard智能再给定时间内查询数据,能有几条就返回几条返回给客户端保住业务保住客户
Multi-index 多索引搜索
多索引搜索逗号隔开
get myindex,test/_search?q=name:中
多索引统一前缀
get myindex*/_search?q=name=zz
例如日志数据每天存储数据
存储的时候统一浅醉,日志按照日期分开
搜索实现流程
客户端发送一个搜索请求,会把请求达到所有的主分片上查询,
因为每个主分片上都有一部分数据,每个主分片同时搜索
当让如果有副本,也会到副本分片上查询
如果发现主分片特别繁忙会分发到副本分片上搜索
分页搜索
delete myindex
put /myindex/_doc/32222222312
{"name":"ss this is the ","age":"ccss"}
get /myindex/_search
from 从什么位置开始 size 几条
get /myindex/_search?size=2&from=0
es deep paging 深度 分页实现原理
因为如果每次查询如果选的数据少如10调 第一节点最高是另外一个最低1000后的值
这样分页是错误的,所以使用如下方式
每个节点将前10000条数据发给协调节点,协调节点分析值返回客户,就是性能较差
建议减少使用深度分页
Query string 基础语法
正向搜索
Get /myindex/_search?q=+name:张
逆向搜索
条件key 后加=-值
get /myindex/_search?q=-name:张
_all全查 不指定字段直接查询匹配
get /myindex/_search?q=张
query DSL
get /myindex/_search
{
“query”:{
“bool”:{
“must”:[
{“match”:{
“description”:”中国话“
}}
]
}
}
}
Must 符合的
Should 应该符合的
Must_not 不符合的
//全文检索简单写法
get /myindex/_search
{
“query”:{
“match”:{
“description”:”中国话“
}
}
}
相关度评分算法
数据先分词,插入的时候分出词
倒排索引搜索关键词
通过搜索的分词 和存储的分词进行校验
命中词次数高的得分高
Dsl语法
全文查询
Get /myindex/_search
{
“query”:{
“match_all”:{}
}
}
//查询某几个字段
Get /myindex/_search
{
“query”:{
“multi_match”:{
“query”:”程序员”,
“fields”:[“name”,”age”]
}
}
}
范围查询range gte 大于 lte 小于
Get /myindex/_search
{
“query”:{
“range”:{
“price”:{
“gte”:80,
“lte”90
}
}
}
}
Term query 不分词 查询
Get /myindex/_search
{
“query”:{
“term”:{
“name”:”张三”
}
}
}
Terms 多值 不分词查询
Get /myindex/_search
{
“query”:{
“terms”:{
“name” : [”张三”,”小乔”,”赵云”]
}
}
}
Exist query 查询有这个字段的文档
Get /myindex/_search
{
“query”:{
“exists”:{
“field”:”name”
}
}
}
Fuzzy query 查询包含与搜索次类似的词 相似匹配
通过相似词作为度量级别
搜索错词但是出现正确相近内容
Get /myindex/_search
{
“query”:{
“fuzzy”:{
“name”:{
“value”:”亮诸葛”
}
}
}
}
Ids 查询 多个文档返回
Get /myindex/_search
{
“query”:{
“ids”:{
“values”:[“1”,”8”,”99”]
}
}
}
前缀查询
Get /myindex/_search
{
“query”:{
“prefix”:{
“name”:{
“values”:”张”
}
}
}
}
Range query 正则查询
Get /myindex/_search
{
“query”:{
“regexp”:{
“name”:{
“values”:”j.*a”,
“flags”:”ALL”,
“max_determinized_states”:10000,
“rewrite”:”constant_score”
}
}
}
}
J开头 结尾
过滤器增加查询条件 不参与匹配评分 filter
通过查询条件查出数据,再过滤数据
Get /myindex/_search
{
“query”:{
“bool”:{
“must”:[
{
“match”:{“name”:”张”}
}
],
Filter:{
“range”:{
“price”:{
“gte”:50,
“lte”:99
}
}
}
}
}
}
查询计划 可用来定位错误语法
Get /myindex/_validate/query?explain
{
“query”:{
“match”:{
“name”:”敦煌”
}
}
}
只过滤不搜索
Get myindex/_search
{
“query”:{
“constant_source”:{
“filter”:{
“term”:{
“name”:”王”
}
}
}
}
}
过滤后自定义排序
Get myindex/_search
{
“query”:{
“constant_source”:{
“filter”:{
“term”:{
“name”:”王”
}
}
}
},
“sort”:[
{
“age”:{
“order”:”desc”
}
}
]
}
Text字段排序问题
插入数据是按照分词插入的所以不能直接排序
插入数据
Get /myindex/_search
{
“query”:{
“match_all”:””
},“sort”:[
{“title”:{“order”:”desc”}}
]
}
解决方案
增加值字段规则
在创建mapping的时候增加一个字段
Name:{
Type:”text”,
Fields:”{
“type”:”keyword”
}
}
可解决排序,但是无法分词了
查询写法
Get /myindex/_search
{
“query”:{
“match_all”:””
},“sort”:[
{“title.keyword”:{“order”:”desc”}}
]
}
Scroll 分批查询 滚动搜索技术
通过第一次搜索快照,每次分批返回,在时间范围内完成搜索即可
一分钟搜索
Get /myindex/_search?scroll=1m
{
“query”:{
“match_all”:{}
},
“size”:1
}
第一排完后有一个 _scroll_id 之后的查询带上这个id查询
Get /_search?scroll
{
“scroll”:”1m”
“scrool_id”:”xxx”
}
之后每次都带上这个id即可
分页查询
一般就查前几页
Scoll 应用场景
Scroll 一般是内部用户操作 如 数据转移,零停机改变索引数据转移
ok
持续更新
2301_78455642: 单独启动模式,Springboot项目必须要添加那些jvm启动参数吗
何冽冽同学: //生成无头浏览器 driver = new ChromeDriver(service, chromeOptions);,这个driver一直是空,ChromeDriver(service, chromeOptions)没有生效,这个大概是哪的问题呀
点点滴滴_: 需要登录验证的怎么截取呢
宇神城主_蒋浩宇: //增加测试实例 //js原生请求方法 function ajax(url,num){ var xhr = new XMLHttpRequest(); xhr.open('GET',url); xhr.send(); xhr.onreadystatechange = function(){ console.log(num+' '+xhr.response); } } //测试运行 for (var i=0;i<1000;i++) { ajax('http:localhost:9000/api/sum',i); }
宇神城主_蒋浩宇: for (var i=0;i<1000;i++) { ajax('http:localhost:9000/api/sum'); }