目的: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