您的位置 首页 > 德语词汇

alphabetically的 Elasticsearch——范围查询range

大家好,如果您还对alphabetically的不太了解,没有关系,今天就由本站为大家分享alphabetically的的知识,包括Elasticsearch——范围查询range的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

alphabetically的 Elasticsearch——范围查询range

实际上,对数字范围进行过滤有时会更有用。例如,我们可能想要查找所有价格大于$20且小于$40美元的产品。

SELECTdocument\nFROMproducts\nWHEREpriceBETWEEN20AND40

Elasticsearch有range查询,不出所料地,可以用它来查找处于某个范围内的文档:

"range":{\n"price":{\n"gte":20,\n"lte":40\n}\n}

range查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:

下面是一个范围查询的例子:.

GET/my_store/products/_search\n{\n"query":{\n"constant_score":{\n"filter":{\n"range":{\n"price":{\n"gte":20,\n"lt":40\n}\n}\n}\n}\n}\n}

如果想要范围无界(比方说>20),只须省略其中一边的限制:

"range":{\n"price":{\n"gt":20\n}\n}

拷贝为curl在Sense中查看

range查询同样可以应用在日期字段上:

"range":{\n"timestamp":{\n"gt":"2014-01-0100:00:00",\n"lt":"2014-01-0700:00:00"\n}\n}

当使用它处理日期字段时,range查询支持对日期计算(datemath)进行操作,比方说,如果我们想查找时间戳在过去一小时内的所有文档:

"range":{\n"timestamp":{\n"gt":"now-1h"\n}\n}

这个过滤器会一直查找时间戳在过去一个小时内的所有文档,让过滤器作为一个时间滑动窗口(slidingwindow)来过滤文档。

日期计算还可以被应用到某个具体的时间,并非只能是一个像now这样的占位符。只要在某个日期后加上一个双管符号(||)并紧跟一个日期数学表达式就能做到:

"range":{\n"timestamp":{\n"gt":"2014-01-0100:00:00",\n"lt":"2014-01-0100:00:00||+1M"\n}\n}

早于2014年1月1日加1月(2014年2月1日零时)

日期计算是日历相关(calendaraware)的,所以它不仅知道每月的具体天数,还知道某年的总天数(闰年)等信息。

range查询同样可以处理字符串字段,字符串范围可采用字典顺序(lexicographically)或字母顺序(alphabetically)。例如,下面这些字符串是采用字典序(lexicographically)排序的:

在倒排索引中的词项就是采取字典顺序(lexicographically)排列的,这也是字符串范围可以使用这个顺序来确定的原因。

如果我们想查找从a到b(不包含)的字符串,同样可以使用range查询语法:

"range":{\n"title":{\n"gte":"a",\n"lt":"b"\n}\n}

注意基数

数字和日期字段的索引方式使高效地范围计算成为可能。但字符串却并非如此,要想对其使用范围过滤,Elasticsearch实际上是在为范围内的每个词项都执行term过滤器,这会比日期或数字的范围过滤慢许多。

字符串范围在过滤低基数(lowcardinality)字段(即只有少量唯一词项)时可以正常工作,但是唯一词项越多,字符串范围的计算会越慢。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023