有一个技术问题请大家帮忙指导,谢谢大家了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
palmers
V2EX    程序员

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

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

    背景是这样的: 使用 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);
    uer = 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     Solana     1015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:37 PVG 02:37 LAX 10:37 JFK 13:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86