我有一个包含 20000 个域名的数据库,包括顶级域、二级和低级域。例如
.biz stackoverflow.com ru.wikipedia.com
我想执行快速查找以查看输入 URL 是否与这 20000 个中的任何一个匹配。我可以使用 Dictionary 键或 HashSet.Contains,但它仅适用于完全匹配。由于数据库还包含 TLD 名称,因此我希望 acmeycompany.biz 也因为 .biz TLD 而返回匹配项。另一方面,fr.wikipedia.com 不应该匹配,因为子域不同。
简单地遍历列表并进行基于字符串的比较也不是一种选择。如果我有 1000 个 URL 进行比较,那就太慢了。所以它必须是基于键的索引查找。
我正在考虑构建一个如下所示的树结构,然后进行基于键的查找,例如:
.com .wikipedia .ru .stackoverflow .biz
然后我可以将输入 Url (sampledomain.com) 拆分为多个部分并像 .com -> .sampledomain 这样进行查找
任何人都可以指点我一个样本怎么做吗?或者还有什么其他选择?任何样品表示赞赏。
谢谢!
这就是我开始的方式......这是 vb.net 代码,但你明白了。
Public Class TreeNode
Sub New()
ChildNodes = New Dictionary(Of String, TreeNode)
End Sub
Public Property Key As String
Public Property ChildNodes As Dictionary(Of String, TreeNode)
End Class
Private Tree As New Dictionary(Of String, TreeNode)
Sub BuildTree()
For Each Link In Links
If Uri.IsWellFormedUriString(Link, UriKind.Absolute) Then
Dim Url As New Uri(Link)
Dim Domain As String
If Url.HostNameType = UriHostNameType.Dns Then
Domain = Url.Host.ToLower.Replace("www.", "")
Dim DomainParts() As String = Domain.Split(CChar("."))
'lets start from TLD
For Each Key In DomainParts.Reverse
'dont konw how to populate tree
Next
End If
End If
Next
End Sub
Function TreeLookup(Link As String) As Boolean
Dim Url As New Uri(Link)
Dim Domain As String
Dim IsMatch As Boolean = False
If Url.HostNameType = UriHostNameType.Dns Then
Domain = Url.Host.ToLower.Replace("www.", "")
Dim DomainParts() As String = Domain.Split(CChar("."))
Dim DomainPartsCount As Integer = DomainParts.Length
Dim Index As Integer = 0
For Each Key In DomainParts
Index += 1
'use recursive loop to see if
'returns true if directory contains key and we have reached to the last part of the domain name
If Index = DomainPartsCount Then
IsMatch = True
Exit For
End If
Next
End If
Return IsMatch
End Function