Elasticsearch 查询与过滤

今天在给上级汇报工作的时候,被问到了这个问题,一时也没回到上来。

英文原文:

https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html

前面我们讲到的是关于结构化查询语句,事实上我们可以使用两种结构化语句: 结构化查询(Query DSL)和结构化过滤(Filter DSL)。 查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异。

一条过滤语句会询问每个文档的字段值是否包含着特定值:

  • created 的日期范围是否在 20132014 ?
  • status 字段中是否包含单词 "published" ?
  • lat_lon 字段中的地理位置与目标点相距是否不超过10km ?

一条查询语句与过滤语句相似,但问法不同:

查询语句会询问每个文档的字段值与特定值的匹配程度如何?

查询语句的典型用法是为了找到文档:

  • 查找与 full text search 这个词语最佳匹配的文档
  • 查找包含单词 run ,但是也包含runs, running, jogsprint的文档
  • 同时包含着 quick, brownfox --- 单词间离得越近,该文档的相关性越高
  • 标识着 lucene, searchjava --- 标识词越多,该文档的相关性越高

一条查询语句会计算每个文档与查询语句的相关性,会给出一个相关性评分 _score,并且 按照相关性对匹配到的文档进行排序。 这种评分方式非常适用于一个没有完全配置结果的全文本搜索。

性能差异

使用过滤语句得到的结果集 -- 一个简单的文档列表,快速匹配运算并存入内存是十分方便的, 每个文档仅需要1个字节。这些缓存的过滤结果集与后续请求的结合使用是非常高效的。

查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存。

幸亏有了倒排索引,一个只匹配少量文档的简单查询语句在百万级文档中的查询效率会与一条经过缓存 的过滤语句旗鼓相当,甚至略占上风。 但是一般情况下,一条经过缓存的过滤查询要远胜一条查询语句的执行效率。

过滤语句的目的就是缩小匹配的文档结果集,所以需要仔细检查过滤条件。

什么情况下使用

原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句。

时间: 2024-10-13 20:46:12

Elasticsearch 查询与过滤的相关文章

Python Elasticsearch DSL 查询、过滤、聚合操作实例

github.com/yongxinz/te… Elasticsearch 基本概念 Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的database 概念.一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas. Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据. document由多个field组成,不同的document里面同名的field一定具有相同

一些最重要的查询和过滤(most important queries and filters)

ES有很多不同的请求和过滤方式,然而常用的不多.我们将会在Search in depth中更详细的讲解,此处,就把最重要的一些查询和过滤做一个快速的介绍. term filter term filter被用来过滤确切的值,可以是数字,日期,boolean,或者not_analyzed的字符串: {"term":{"age":    26           }}{"term":{"date":   "2014-09-

Elasticsearch入门教程(五):Elasticsearch查询(一)

原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79228852 // 准备数据 PUT /shop/goods/1 { "name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服", &quo

Elasticsearch入门教程(六):Elasticsearch查询(二)

原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79237950 地理坐标点geo-point 地理坐标点:是指地球表面可以用经纬度描述的一个点. 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中,或在聚合中. 地理坐标点不能被

datatable 使用LAMBDA表达查询,过滤

DataTable dt = new DataTable(); DataColumn dc = new DataColumn("UserName", System.Type.GetType("System.String")); DataColumn dc1 = new DataColumn("UserPwd", System.Type.GetType("System.String")); dt.Columns.Add(dc);

Func<T,T>应用之Elasticsearch查询语句构造器的开发

前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryGroup = "{\"query\": {\"match\": { \"roomid\": \"FRIEND_12686_10035\" }}}"; //关键字查询 string queryKeyWord =

sql 查询条件过滤替换特许符号(‘,",+,!等)

查询条件过滤替换特许符号 public static string SpecialSymbols(string strText) { strText = strText.Trim(); strText = strText.Replace("!", "' + char(33) + '"); strText = strText.Replace("\"", "' + char(34) + '"); strText = st

Android CursorAdapter 查询联系人过滤

一.使用sqlite 数据库查询时,用于模糊查询的方法 like % : 表示有0个或多个字符 _  : 表示1个字符 二.去掉联系人电话号码中的空格: "replace"(data1, ' ', '') LIKE '13_________' 三.查询符合手机号码格式的号码 public Loader<Cursor> onCreateLoader(int id, Bundle args) { String phone = "\"replace\"

分布式搜索引擎Elasticsearch的查询与过滤

一.写入 先来一个简单的官方例子,插入的参数为 -XPUT ,插入一条记录. curl -XPUT'http://localhost:9200/test/users/1' -d'{ "user": "test", "post_date": "2009-11-15T14:12:12", "message": "Elastic Search" }' { "_index":