您的位置:首页 > 其它

深入理解ElasticSearch(查询DSL进阶)读书笔记

2018-08-24 16:38 211 查看

DSL (Domain Specific Language) 领域专业语言

[code]Apache Lucene默认评分
文档何时被匹配上;TF/IDF评分公式(见)
ES如何看评分(控制文档得分):customer_boost_factor,constant_score,customer_score及脚本查询

 TF及IDF评分

[code]查询改写
就是把费时的原始类型实例改写成一个性能更高的查询类型实例
以前缀查询为例
默认的字段映射为String;
回顾lucene的范例
将前缀查询改为常数得分查询发现改写后的查询性能有所提升 尤其是当索引中有不同的词项
查询改写属性
对于任何多词项查询(前缀和通配符)使用rewrite参数控制查询改写
参数可配置值(暂时先放放)
socring_boolean
constant_score_boolean
constant_socre_filter
top_terms_N
top_terms_boost_N
如果能接受低精度 选topN,如果能接受高精度,选bool查询(低性能)
二次评分
理解二次评分
重新计算查询返回文档中指定个数文档的得分,表示ES会截取查询返回文档的前N个并使用
预定义的二次评分方法来重新计算得分

[code]    执行脚本性能低,因此在第二个查询再使用它;
由于二次评分是在原始文档查询的前N个文档上重新计算,因而降低了对性能的影响
二次评分的参数设置
rescore对象中的查询参数必须配置下面参数
window_size:每个分片上参与评分的文档个数
rescore_query_weight:二次评分查询的权重值,默认是1,二次评分查询得分*resoce_query_weight+
原始得分*query_weight
query_weight:查询权重值,默认是1,原始得分与二次评分相加之前乘以该值
rescore_mode:二次评分模式:total,max,min,avg,multiply
小结二次评分不影响顺序,因为排序发生在前,使用二次评分三思
批量操作
批量取
MultiGet通过_mget断点操作 使用一个请求,获取多个文档,文档获取是实时获取
返回所有文档(不管这些文档可用于搜索还是暂时对查询不可见)
批量查询
允许用户将多个请求打包到一组 返回的是响应对象数组
排序
当发送es查询时,返回文档默认按文档得分降序排序,通常会存在指定排序的情况

 

[code]基于多字段排序
ES早期,并没有任何意义,因为ES并不知道依照字段的哪个值进行排序 ,ES 0.90后可行,

 

[code]基于多值geo字段排序
ES 0.92.0RC2版本提供了基于多维坐标数据的排序
例如查找特定国家里离自己最近的一个机构
"mappings":{
"poi":{
"properties":{
"country":{
"type":"string"
}
"loc":{
"type":"geo"
}
}
}
}

 

[code]    可以看出返回结果包含这个值:"sort":[0.0],这是因为文档中的地理坐标和与
查询中的坐标精确匹配 我们在查询中配置mode属性为max,则会返回一个不同的值,
返回结果的高亮部分就是sort最大
基于嵌套对象的排序
用户可以基于字段定义的嵌套对象排序
适用下面两种情形 显示嵌套映射的文档(type=nested),使用对象类型的文档

 嵌套查询两种方式

 

[code]数据更新API

简单字段更新 _update命令,doc对象修改字段title,year
使用脚本按条件更新,_update,script脚本命令对文档进行修改
使用更新api创建和删除文档
_update doc对象修改已有文档的year字段 ,如果该文档year字段不存在,将会创建新文档,
并且该文档会创建一个新字段title
使用过滤器优化查询
过滤器缓存:ES提供了一个很好的过滤器缓存的机制,被缓存的过滤器不需要消耗过多的内存;另外
过滤器缓存 缓存的是个性化更小的数据,而不是个性化更强的数据 如人的名称

 

[code] ES并不是所有过滤都默认被缓存

 

[code]    过滤器缓存key命名设置
如果不设置,清除缓存的话就是清所有,如果设置了的话,就是清除指定key
改变ES的缓存行为(根据实际情况改变)
如果有需要,ES允许用户通过设置_cach和_cach_key属性来开启或关闭过滤器的缓存机制;

 

 

[code]   词项查找过滤器
工作机制就是:找到索引,找到type属性里的那些属性文档 id,是文档id,path是文档的字段加载词项
将该词项用于词项过滤器

将两项查询合并为一项 

 

[code]   性能考虑
前面的查询执行在ES内部经过缓存机制优化,将这些词项加入到缓存中,后续查询就不会重复加载;
如果在词项查找过程中使用到的数据量不大,建议索引只创建一个分片,并且只保留一份副本,之所以
这样是因为ES优先在本地执行查询,以避免不必要的网络开销和延迟,进而提高查询的性能
内部对象中加载词项
查询条件id:books  转换为id:books.book
词项查询过滤器缓存设置(缓存类型LRU缓存)

ES切面机制中的过滤器和作用域
1 系统只在查询结果只上计算切面结果,如果你在filter对象内部且在query对象外部包含了过滤器,
那么这些过滤器将不会对参与切面计算文档的影响
2 另外一个需要注意的是作用域,他能扩充用于切面计算的文档

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: