有一个技术问题请大家帮忙指导,谢谢大家了

2021-08-03 23:10:58 +08:00
 palmers

背景是这样的: 使用 Elasticsearch 存储数据,其中有一个字段需要表示包含的标记,一共会有大概 32 种,这 32 种是可以共存的,之后需要支持查询,比如查询被 1 、2 、3 这三种标记的数据 我想到的办法:

  1. 使用 32 位字符,初始位 0 占位, 每一位表示一种标记,有标记则为 1,则查询 es 时候需要使用正则来匹配,这好像没有办法走分词 导致性能会低
  2. 这 32 种标记使用编号逗号分隔,然后这个字段设置分词 然后使用模糊匹配 好像也不太行

我也是刚开始这么深入的使用 es, 不知道还有哪些办法,请熟悉 es 的朋友指点我一下 谢谢大家了!

2876 次点击
所在节点    程序员
16 条回复
kernelpanic
2021-08-04 02:05:18 +08:00
跟 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
PolarBears
2021-08-04 04:27:14 +08:00
可以存成字符串数组
aragakiyuii
2021-08-04 07:19:09 +08:00
关键词 bitmap 位图
1018ji
2021-08-04 08:55:01 +08:00
整数,直接存数组 terms 通过 minimum_should_match_script 控制匹配数量
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);

```
palmers
2021-08-04 09:03:52 +08:00
@kernelpanic 谢谢 不过我还有一点不明白,这种查询直接匹配 被 1 2 3 同时标记的数据检索很方便? 如果是或者的关系, 比如 只要是被 1 或 2 或 3 标记过的或更复杂的或关系 都查询出来 那我入参需要将这 N 种情况全部换算出来然后使用 should 去查询吗?
palmers
2021-08-04 09:05:16 +08:00
@PolarBears 字符串数组 如何查询呢?
PolarBears
2021-08-04 09:23:48 +08:00
weofuh
2021-08-04 09:24:56 +08:00
直接存数组吧。用 terms 查询含有标签 1 、3 、5 任意一种的文档数据
{
"query": {
"bool": {
"must": [
{
"terms": {
"tags": [
1,3,5
]
}
}
]
}
}
}
palmers
2021-08-04 09:31:21 +08:00
@aragakiyuii 谢谢 我大概了解了 但是还没有想明白怎么运用到 es 上
PolarBears
2021-08-04 09:36:05 +08:00
@palmers 这种方式的话就你有 32 种标记的话,一个 32 位整数就能足够表达这字段有哪些标记。
具体可以搜索下关键词 enum flag 。
palmers
2021-08-04 09:37:01 +08:00
@weofuh 好 我试试 谢谢了
palmers
2021-08-04 09:37:23 +08:00
@PolarBears 谢谢 我知道了
palmers
2021-08-04 09:38:24 +08:00
@PolarBears 好 我去查查 enum flag 多谢~
aragakiyuii
2021-08-04 09:43:40 +08:00
palmers
2021-08-04 09:59:19 +08:00
@aragakiyuii 谢谢 大概这意思还是使用 枚举的方式实现了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX