深入理解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个并使用
        预定义的二次评分方法来重新计算得分

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

 

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

 

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

 

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

 嵌套查询两种方式

 

数据更新API

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

 

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

 

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

 

 

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

将两项查询合并为一项 

 

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

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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icool_ali

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值