请问怎么利用数据库索引实现域名匹配查询?数据库存了域名列表,现在要查询一个给定域名是否命中列表

55 天前
 cogear

举例

我使用的是 Microsoft SQL Server, 假设不考虑通配符,数据库Hostname列建了索引,并存了一些域名:

假设现在有这么个域名 www.sub.test.com, 我应该查询数据库获得 test.comsub.test.com

我的实现

查询Hostname列时,like '%test.com',这样的写法是无法命中索引的,只有%放在末尾才能命中文本列的索引。

所以我存储了另一列 ReversedHostname ,把域名反转存储。SQL 查询时把要查询的域名也反转,然后 Where 语句这么写

WHERE Reverse(要查询的域名) like ReversedHostname + '.%'

但是实践证明这也不能命中索引。

只有这样的查询

Where ReversedHostname like 'moc.tset.%'

才能命中索引。

有没有更好的实现?大家做域名匹配一般使用什么方式

1571 次点击
所在节点    数据库
12 条回复
beck123
55 天前
laminux29
55 天前
直接 es 不香嘛? es 专为高性能搜索而生,它的次时代索引,对这些传统关系型数据库来说,简直是降维打击。
cogear
55 天前
@a1010795186 我去,好思路!
opengps
55 天前
force index
kingcanfish
55 天前
你换个思路,com.test.sub.www 这样存 , 写个函数转换下顺序不就可以了
meiyiliya
55 天前
test.com = com.test
sub.test.com = com.test.sub
hostname like 'com.test%'
llsquaer
55 天前
有点像梯子软件的域名匹配啊。参考下 clash 的匹配算法不一定要用数据库
meshell
55 天前
6 楼正确
cogear
55 天前
@kingcanfish
@meiyiliya

要查询的域名是 www.sub.test.com
数据库 hostname 列存的是 test.com sub.test.com
AlphaXM
54 天前
最近在研究 bind-dlz,这是 DNS 服务器 Bind9 的一个扩展模块,支持从数据库查询 dns 记录。附上链接 https://bind-dlz.sourceforge.net/mysql_example.html
cheng6563
53 天前
WHERE Reverse(要查询的域名)

你这也没反转过来存啊...
cogear
53 天前
@cheng6563 反转存储的列名是 ReversedHostname 。

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

https://yangjunhui.monster/t/1124968

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

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

© 2021 V2EX