背景是这样的: 使用 Elasticsearch 存储数据,其中有一个字段需要表示包含的标记,一共会有大概 32 种,这 32 种是可以共存的,之后需要支持查询,比如查询被 1 、2 、3 这三种标记的数据 我想到的办法:
我也是刚开始这么深入的使用 es, 不知道还有哪些办法,请熟悉 es 的朋友指点我一下 谢谢大家了!
1
kernelpanic 2021-08-04 02:05:18 +08:00 2
跟 es 没啥关系,一般都是这样设计
0001 -> 1 被 1 标记 0010 -> 2 被 2 标记 0011 -> 3 被 1,2 标记 0100 -> 4 被 3 标记 0101 -> 5 被 1,3 标记 0110 -> 6 被 2,3 标记 0111 -> 7 被 1,2,3 标记 存储最终的十进制就可以,查询被 1 、2 、3 这三种标记的数据就是 flag<8 |
2
PolarBears 2021-08-04 04:27:14 +08:00
可以存成字符串数组
|
3
aragakiyuii 2021-08-04 07:19:09 +08:00 via iPhone
关键词 bitmap 位图
|
4
1018ji 2021-08-04 08:55:01 +08:00
整数,直接存数组 terms 通过 minimum_should_match_script 控制匹配数量
|
5
ada87 2021-08-04 09:02:43 +08:00
直接给你代码
```javascript //定义权限,只能是 0-30 的数字,每个权限定义不要重复 var tq0 = 0; var tq1 = 1; var tq2 = 2; var tq3 = 3; var tq4 = 4; var tq5 = 5; var tq6 = 6; var tq7 = 7; //判断是否有权限 function usrhastq(u, t) { return (u & (1 << t)) > 0; } //创建一个不具任何权限的 function buildUser() { return 0; } //给添加权限 function addTq(u, t) { if (usrhastq(u, t)) { console.log("已经具有此权限"); return u; } return u | (1 << t); } //删除的权限 function removeTq(u, t) { if (!usrhastq(u, t)) { console.log("还不具有此权限"); return u; } return u & (~(1 << t)); } //显示具有的权限 function display(u) { console.log("是否有权限零:" + usrhastq(u, tq0)); console.log("是否有权限一:" + usrhastq(u, tq1)); console.log("是否有权限二:" + usrhastq(u, tq2)); console.log("是否有权限三:" + usrhastq(u, tq3)); console.log("是否有权限四:" + usrhastq(u, tq4)); console.log("是否有权限五:" + usrhastq(u, tq5)); console.log("是否有权限六:" + usrhastq(u, tq6)); console.log("是否有权限七:" + usrhastq(u, tq7)); } //demo var user = buildUser(); console.log(user); user = addTq(user, tq3); console.log(user); user = addTq(user, tq6); console.log(user); user = addTq(user, tq3); console.log(user); user = removeTq(user, tq1); console.log(user); user = removeTq(user, tq3); console.log(user); display(user); ``` |
6
palmers OP @kernelpanic 谢谢 不过我还有一点不明白,这种查询直接匹配 被 1 2 3 同时标记的数据检索很方便? 如果是或者的关系, 比如 只要是被 1 或 2 或 3 标记过的或更复杂的或关系 都查询出来 那我入参需要将这 N 种情况全部换算出来然后使用 should 去查询吗?
|
7
palmers OP @PolarBears 字符串数组 如何查询呢?
|
8
PolarBears 2021-08-04 09:23:48 +08:00
@palmers [Filter items which array contains any of given values
]( https://stackoverflow.com/questions/28001632/filter-items-which-array-contains-any-of-given-values) |
9
weofuh 2021-08-04 09:24:56 +08:00
直接存数组吧。用 terms 查询含有标签 1 、3 、5 任意一种的文档数据
{ "query": { "bool": { "must": [ { "terms": { "tags": [ 1,3,5 ] } } ] } } } |
10
palmers OP @aragakiyuii 谢谢 我大概了解了 但是还没有想明白怎么运用到 es 上
|
11
PolarBears 2021-08-04 09:36:05 +08:00
@palmers 这种方式的话就你有 32 种标记的话,一个 32 位整数就能足够表达这字段有哪些标记。
具体可以搜索下关键词 enum flag 。 |
13
palmers OP @PolarBears 谢谢 我知道了
|
14
palmers OP @PolarBears 好 我去查查 enum flag 多谢~
|
15
aragakiyuii 2021-08-04 09:43:40 +08:00
|
16
palmers OP @aragakiyuii 谢谢 大概这意思还是使用 枚举的方式实现了
|