之前查过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
这种应该怎么实现呢?
如果是mysql,你们设计数据库时连基本的范式都不考虑,没有做到每个字段只存放不可分割的数据单元,最终自食其果。我目前只能想到2个方法,1是修改表结构,把老数据导入到新表里。每行只放1个tag;2是遍历所有行。
如果是非关系型数据库,我就不太了解了。
这个之前就是多对多的存放的,因为解决不了这个问题,换成现在这样的。如果在mysql每行只放一个tag,我的查询条件是[1,2,4,5,7] 怎么查询正确的结果,第二个办法暂时先部考虑,数据量大的情况下开销太大了。
@初心Java: 哦,我明白你的意思了。等我想一下啊
我倒是有一计,不知道可行不可行。数据库这样存:
id | tag |
---|---|
1 | 1-2-3-4-5 |
2 | 1-2-4-5 |
3 | 1-2-7 |
就是tag按照从小到大组成一个字符串,然后比如查询条件是[1,2,4,5,7],把这个数组也按从小到大的规则分成n个子串,这里就是:
这样一直遍历,把所有的子串都找到,然后再挨个查询,形如这样:select * from t where tag = 子串
这样做的一个缺点是,如果查询数组很大,会搞出很多很多的子串来。
那个我先去忙了,等我下班后我再想想有没有其它更好的办法
不过我感觉你以前那种多对多的设计方法也是可以查询的。等我下班后如果有时间我再看下啊。
@会长: 嗯嗯 好的 谢谢你 方便加我个Q吗 583251860
查询数据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)
select * from table where tag like '%,1,%' or tag like '%,2,%' or tag like '%,4,%' or tag like '%,5,%' or tag like '%,7,%'
.....