V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
palmers
V2EX  ›  程序员

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

  •  
  •   palmers · 2021-08-03 23:10:58 +08:00 · 3029 次点击
    这是一个创建于 1211 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    16 条回复    2021-08-04 09:59:19 +08:00
    kernelpanic
        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
    PolarBears
        2
    PolarBears  
       2021-08-04 04:27:14 +08:00
    可以存成字符串数组
    aragakiyuii
        3
    aragakiyuii  
       2021-08-04 07:19:09 +08:00 via iPhone
    关键词 bitmap 位图
    1018ji
        4
    1018ji  
       2021-08-04 08:55:01 +08:00
    整数,直接存数组 terms 通过 minimum_should_match_script 控制匹配数量
    ada87
        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);

    ```
    palmers
        6
    palmers  
    OP
       2021-08-04 09:03:52 +08:00
    @kernelpanic 谢谢 不过我还有一点不明白,这种查询直接匹配 被 1 2 3 同时标记的数据检索很方便? 如果是或者的关系, 比如 只要是被 1 或 2 或 3 标记过的或更复杂的或关系 都查询出来 那我入参需要将这 N 种情况全部换算出来然后使用 should 去查询吗?
    palmers
        7
    palmers  
    OP
       2021-08-04 09:05:16 +08:00
    @PolarBears 字符串数组 如何查询呢?
    PolarBears
        8
    PolarBears  
       2021-08-04 09:23:48 +08:00
    weofuh
        9
    weofuh  
       2021-08-04 09:24:56 +08:00
    直接存数组吧。用 terms 查询含有标签 1 、3 、5 任意一种的文档数据
    {
    "query": {
    "bool": {
    "must": [
    {
    "terms": {
    "tags": [
    1,3,5
    ]
    }
    }
    ]
    }
    }
    }
    palmers
        10
    palmers  
    OP
       2021-08-04 09:31:21 +08:00
    @aragakiyuii 谢谢 我大概了解了 但是还没有想明白怎么运用到 es 上
    PolarBears
        11
    PolarBears  
       2021-08-04 09:36:05 +08:00
    @palmers 这种方式的话就你有 32 种标记的话,一个 32 位整数就能足够表达这字段有哪些标记。
    具体可以搜索下关键词 enum flag 。
    palmers
        12
    palmers  
    OP
       2021-08-04 09:37:01 +08:00
    @weofuh 好 我试试 谢谢了
    palmers
        13
    palmers  
    OP
       2021-08-04 09:37:23 +08:00
    @PolarBears 谢谢 我知道了
    palmers
        14
    palmers  
    OP
       2021-08-04 09:38:24 +08:00
    @PolarBears 好 我去查查 enum flag 多谢~
    aragakiyuii
        15
    aragakiyuii  
       2021-08-04 09:43:40 +08:00
    palmers
        16
    palmers  
    OP
       2021-08-04 09:59:19 +08:00
    @aragakiyuii 谢谢 大概这意思还是使用 枚举的方式实现了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5518 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:51 · PVG 16:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.