首页 新闻 赞助 找找看

给定一个查询条件的数组,用什么方法可以快速检索出被这个数组包含的数据

0
悬赏园豆:200 [待解决问题]

之前查过solr,luncen,mysql 没查到如何实现
数据:id:1,tag:[1,2,3,4,5]
id:2,tag:[1,2,4,5]
id:3,tag:[1,2,7]
查询条件:[1,2,4,5,7] 被检索出的数据 应该为 id:2 id:3
这种应该怎么实现呢?

初心Java的主页 初心Java | 初学一级 | 园豆:8
提问于:2020-01-15 11:43
< >
分享
所有回答(4)
1

如果是mysql,你们设计数据库时连基本的范式都不考虑,没有做到每个字段只存放不可分割的数据单元,最终自食其果。我目前只能想到2个方法,1是修改表结构,把老数据导入到新表里。每行只放1个tag;2是遍历所有行。

如果是非关系型数据库,我就不太了解了。

会长 | 园豆:12401 (专家六级) | 2020-01-15 14:20

这个之前就是多对多的存放的,因为解决不了这个问题,换成现在这样的。如果在mysql每行只放一个tag,我的查询条件是[1,2,4,5,7] 怎么查询正确的结果,第二个办法暂时先部考虑,数据量大的情况下开销太大了。

支持(0) 反对(0) 初心Java | 园豆:8 (初学一级) | 2020-01-15 14:26

@初心Java: 哦,我明白你的意思了。等我想一下啊

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-01-15 14:29

我倒是有一计,不知道可行不可行。数据库这样存:

id tag
1 1-2-3-4-5
2 1-2-4-5
3 1-2-7

就是tag按照从小到大组成一个字符串,然后比如查询条件是[1,2,4,5,7],把这个数组也按从小到大的规则分成n个子串,这里就是:

  • 1
  • 1-2
  • 1-2-4
  • 1-2-4-5
  • 1-2-4-5-7
  • 2
  • 2-4
    ......

这样一直遍历,把所有的子串都找到,然后再挨个查询,形如这样:select * from t where tag = 子串

这样做的一个缺点是,如果查询数组很大,会搞出很多很多的子串来。

那个我先去忙了,等我下班后我再想想有没有其它更好的办法

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-01-15 14:37

不过我感觉你以前那种多对多的设计方法也是可以查询的。等我下班后如果有时间我再看下啊。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-01-15 14:41

@会长: 嗯嗯 好的 谢谢你 方便加我个Q吗 583251860

支持(0) 反对(0) 初心Java | 园豆:8 (初学一级) | 2020-01-15 14:56
0

查询数据tag数组的长度是未知的,查询条件的组合(元素有序)可以有2^n (n为查询数组的长度)
严格等于的查询需要写2^n 个
-----------------------------------
你以前是咋查询的?
----------------------------------
目前ES在重新设计数据格式的前提下,ES能优化到查询条件需要写n 个
数据格式:id:1,tag:[1,2,3,4,5], tag_count:5
查询满足条件的数组长度等于4的

boolQuery()
    .should(条件1)
    .should(条件2)
    .should(条件3)
    .should(条件4)
    .should(条件5)
    .should(条件6)
    .must(tag数组的长度等于4)
    .minShouldMatch(4) 
大志若愚 | 园豆:2138 (老鸟四级) | 2020-01-16 17:18
0

select * from table where tag like '%,1,%' or tag like '%,2,%' or tag like '%,4,%' or tag like '%,5,%' or tag like '%,7,%'

弯月亮 | 园豆:217 (菜鸟二级) | 2020-01-16 17:22
0

.....

初心Java | 园豆:8 (初学一级) | 2020-01-21 16:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册