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

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

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

 TF及IDF评分

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

深入理解ElasticSearch(查询DSL进阶)读书笔记_第1张图片

    执行脚本性能低,因此在第二个查询再使用它;
    由于二次评分是在原始文档查询的前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查询时,返回文档默认按文档得分降序排序,通常会存在指定排序的情况

 深入理解ElasticSearch(查询DSL进阶)读书笔记_第2张图片

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

 深入理解ElasticSearch(查询DSL进阶)读书笔记_第3张图片

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

 深入理解ElasticSearch(查询DSL进阶)读书笔记_第4张图片

深入理解ElasticSearch(查询DSL进阶)读书笔记_第5张图片

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

深入理解ElasticSearch(查询DSL进阶)读书笔记_第6张图片

 嵌套查询两种方式

 

深入理解ElasticSearch(查询DSL进阶)读书笔记_第7张图片

数据更新API

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

深入理解ElasticSearch(查询DSL进阶)读书笔记_第8张图片

 

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

 深入理解ElasticSearch(查询DSL进阶)读书笔记_第9张图片

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

 深入理解ElasticSearch(查询DSL进阶)读书笔记_第10张图片

 

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

深入理解ElasticSearch(查询DSL进阶)读书笔记_第11张图片

将两项查询合并为一项 

深入理解ElasticSearch(查询DSL进阶)读书笔记_第12张图片

深入理解ElasticSearch(查询DSL进阶)读书笔记_第13张图片

 

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

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

 

你可能感兴趣的:(深入理解ElasticSearch(查询DSL进阶)读书笔记)