Elasticsearch查找多个精确值
term 查询对于查找单个值非常有用,但通常我们可能想搜索多个值。 如果我们想要查找价格字段值为 $20 或 $30 的文档该如何处理呢?
不需要使用多个 term 查询,我们只要用单个 terms 查询(注意末尾的 s ), terms 查询好比是 term 查询的复数形式(以英语名词的单复数做比)。
它几乎与 term 的使用方式一模一样,与指定单个价格不同,我们只要将 term 字段的值改为数组即可:{ "terms" : { "price" : [20, 30] } }
与 term 查询一样,也需要将其置入 filter 语句的常量评分查询中使用:GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "terms" : { "price" : [20, 30] } } } } }
这个 terms 查询被置于 constant_score 查询中
运行结果返回第二、第三和第四个文档: "hits" : [ { "_id" : "2", "_score" : 1.0, "_source" : { "price" : 20, "productID" : "KDKE-B-9947-#kL5" } }, { "_id" : "3", "_score" : 1.0, "_source" : { "price" : 30, "productID" : "JODL-X-1937-#pV7" } }, { "_id": "4", "_score": 1.0, "_source": { "price": 30, "productID": "QQPX-R-3956-#aD8" } } ]包含,而不是相等
一定要了解 term 和 terms 是 包含(contains) 操作,而非 等值(equals) (判断)。 如何理解这句话呢?
如果我们有一个 term(词项)过滤器 { "term" : { "tags" : "search" } } ,它会与以下两个文档 同时 匹配:{ "tags" : ["search"] } { "tags" : ["search", "open_source"] }
尽管第二个文档包含除 search 以外的其他词,它还是被匹配并作为结果返回。
回忆一下 term 查询是如何工作的? Elasticsearch 会在倒排索引中查找包括某 term 的所有文档,然后构造一个 bitset 。在我们的例子中,倒排索引表如下:
Token
DocIDs
open_source
2
search
1 ,2
当 term 查询匹配标记 search 时,它直接在倒排索引中找到记录并获取相关的文档 ID,如倒排索引所示,这里文档 1 和文档 2 均包含该标记,所以两个文档会同时作为结果返回。
由于倒排索引表自身的特性,整个字段是否相等会难以计算,如果确定某个特定文档是否 只(only) 包含我们想要查找的词呢?首先我们需要在倒排索引中找到相关的记录并获取文档 ID,然后再扫描 倒排索引中的每行记录 ,查看它们是否包含其他的 terms 。
可以想象,这样不仅低效,而且代价高昂。正因如此, term 和 terms 是 必须包含(must contain) 操作,而不是 必须精确相等(must equal exactly) 。精确相等
如果一定期望得到我们前面说的那种行为(即整个字段完全相等),最好的方式是增加并索引另一个字段, 这个字段用以存储该字段包含词项的数量,同样以上面提到的两个文档为例,现在我们包括了一个维护标签数的新字段: { "tags" : ["search"], "tag_count" : 1 } { "tags" : ["search", "open_source"], "tag_count" : 2 }
一旦增加这个用来索引项 term 数目信息的字段,我们就可以构造一个 constant_score 查询,来确保结果中的文档所包含的词项数量与要求是一致的:GET /my_index/my_type/_search { "query": { "constant_score" : { "filter" : { "bool" : { "must" : [ { "term" : { "tags" : "search" } }, { "term" : { "tag_count" : 1 } } ] } } } } }
这个查询现在只会匹配具有单个标签 search 的文档,而不是任意一个包含 search 的文档。
万众期待的新机预热盘点苹果14开始妥协小米12快了华为失望今年机圈的市场战况真的是愈演愈烈,下半年简直就是神仙过招,临近年终就更加不消停了。各大手机厂商都开始预热新机,其中最典型的就是苹果了,iPhone13才刚发布不就就开始预热iPho
揭秘佳能的EOS相机是怎么在中国风行起来的揭秘佳能的EOS相机是怎么在中国风行起来的木卫9森林999202112201326佳能相机有悠久历史了,但是要说佳能相机真正进入辉煌,还是EOS系统研发出来之后。要说佳能EOS相机
科学公布2021年度十大科学突破来源科技日报科学公布2021年度十大科学突破今日视点北京时间17日,科学网站公布了2021年度科学突破评选结果。让我们一起来看看今年科学界有哪些重大发现。1。人工智能预测蛋白质结构
电商物流分拣员物流分拣员一个月能挣多少钱电商物流是这几年比较常见的,职能部门也有很多种,比如质控采销收货,多退品控物资等等,而最让我们常见的分拣(上下架),作为普工也是工资最高的,同时也是一直缺
如何把APP上传到各大应用市场与应用商店APP开发完成,测试人员内测后,接下来就是要上架到各大应用市场了。在这之前产品人员在开发中就需要把上架的各种资料进行申请。那么今天我们来整理一下上架需要哪些材料。APP应用商店一般
程序员为什么会有35岁危机?万般皆下品,惟有读书高。一直以来,知识分子都是最吃香的。这不仅仅是因为知识改变命运。更是因为几乎一切从事脑力劳动的职业,都是职业寿命十分长的,而且通常是越老越值钱。正是因为脑力劳动
用流量抄亚马逊后路字节系搞野跨境电商如果手里揣着一堆王炸,你会如何出牌?小白都知道这么顺的手气能给对方剃光头就不要再给其出牌的机会。Tiktok的创建者张一鸣想必也不会例外。中国企业出海做了这么多年,BAT等重量级玩
有的人十多年了手机号从来没换过,正常吗?这样的人什么心态?手机不经常换号,用起来很方便,亲人和朋友们找自己有事时,一打原号就容易打通,这正说明心态是最正常的人了,心也是红的,和众人的心一样都正常跳动。若用手机三天两头经常换号者,那有可能是
华为又要发布新机,到今天华为仍是你心中排名第一的国产手机吗?其实我一个普通百姓真的做不了啥,但是选手机可以做到必须国产!是的,华为是打不死的小强,我佩服!观当今世界之格局,作为一个普通中国公民,必须爱国爱家,产品必须国产优先!支持国家及民族
联想最后的挣扎?骁龙888旗舰降1100离场,但依旧受冷落经常关注联想这品牌的朋友都知道,联想做手机业务已经许多年,在智能手机才兴起时还成为了中华联酷当中的一员。但后来由于种种原因,综合性手机业务便搁置了。而正大家都觉得联想要放弃做手机时
亚马逊上新产品,在预售期需要开广告么?今天云商跨境给大家说一下,这个关于预售期开广告的问题。可能很多人想问在预售期,我这个广告应该怎么开?因为很多时候呢在我们这个商品已经到达亚马逊仓库的时候。还没有上架之前呢,那这样我