您当前的位置: 首页 > 

zmc@

暂无认证

  • 1浏览

    0关注

    142博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ES查询效率-Query、Filter&term

zmc@ 发布时间:2020-10-14 22:34:00 ,浏览量:1

目的:Google上博客众说纷纭大同小异,逻辑正确但略为混乱,再此梳理出容易混淆的点  

1.是否算分只与查询方式有关(与是否term查询、match查询无关)

(Query查询)查询上下文:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;

(Filter查询)过滤器上下文:查询操作仅判断是否满足查询条件,不会计算得分,查询的结果可以被缓存;

1、Query查询:在使用query进行查询时的执行环境,比如使用search的时候。 ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配;2、Filter查询:在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter 不会去计算任何分值,也不会关心返回的排序问题,效率会更高。 另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

 

Demo:
query查询:


GET index/_search
{
  "query": {
    "term":  { "foo": "BAR" }
  }
}
filter查询:



GET index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term":  { "foo": "BAR" }}
      ]
    }
  }
}

GET index/_search
{
  "post_filter":{
    "term":{"foo": "BAR"}
  }
}

2.Term查询:term查询虽然是精确匹配,但其是否算分也只与查询方式有关(filter、query)

如果使用filter,则不算分,返回的结果也是没有排序的,至于返回的结果有没有默认排序结果还需要测试(猜测可能会根据docId默认排序,毕竟有个query_then_fetch过程)

Term查询是指对查询条件不分词处理,至于查询的字段,则是根据mapping中对字段的定义决定(keywords则不分词,text则会分词处理)

 

3.query then fetch 如何避免fetch流程:返回结果只保留_docId

 

 

补充:

查询的种类 Elasticsearch中的DSL主要由两部分组成: Leaf query Cluase 叶查询子句: 这种查询可以单独使用,针对某一特定的字段查询特定的值,比如match、term、range等 Compound query Cluase复合查询子句: 这种查询配合其他的叶查询或者复合查询,用于在逻辑上,组成更为复杂的查询,比如bool  

 

 

 

 

 

 

 

关注
打赏
1643271353
查看更多评论
立即登录/注册

微信扫码登录

0.0450s