深入理解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 另外一个需要注意的是作用域,他能扩充用于切面计算的文档
阅读更多
相关文章推荐
- 《深入理解Elasticsearch(原书第2版)》一第2章 查询DSL进阶
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- 干货 |《深入理解Elasticsearch》读书笔记
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- 干货 |《深入理解Elasticsearch》读书笔记
- T-SQL查询进阶--深入理解子查询
- ElasticSearch-深入理解系列8-高级查询
- 深入理解ElasticSearch(底层索引控制)读书笔记
- T-SQL查询进阶--深入理解子查询
- T-SQL查询进阶--深入理解子查询
- 【技术分享】《深入理解Elasticsearch》读书笔记
- T-SQL查询进阶--深入理解子查询
- 深入理解ElasticSearch(五)请求体查询