在没有 IN 运算符的情况下从另一列 table 的一列搜索子字符串
Substring search on one column from the column of another table without IN operator
我在 Azure 中有两个 table,其中一个是 URL 的列表,另一个只有域名。我希望能够检查 URLtable 中的 URL 是否“包含”DomainName_table 中的域名。 不能使用“in”运算符,因为永远不会有完全匹配。
以下虚拟 tables:
let DomainName_table= datatable (domainname: string)
[
"abc456",
"gmail"
]
|summarize domainlist = make_list(domainname);
let URLtable= datatable (URL: string)
[
"abc456/.com/ffsfd/sdfsdfds",
"gmail",//.com/sAFSfS"
"gmddail.com"///sAFfsdfsfSfS"
];
URLtable
| where URL in (DomainName_table)
我也试过拆分URL来提取域名:
let DomainName_table= datatable (domainname: string)
[
"abc456",
"gmail"
]
|summarize domainlist = make_list(domainname);
let URLtable= datatable (URL: string)
[
"https://abc456.com/ffsfd/sdfsdfds",
"https://gmail.com/sAFSfS"
"https://gmddail.com/sAFfsdfsfSfS"
];
URLtable
|extend split_url = split(URL,"/",2)//| project split_url
| where split_url in (DomainName_table)
这也不是一个好方法,因为它也可以是“xyz.abc456.com”并且不会 return 匹配。几乎总是 return a 0 因为 URL 永远不可能完全匹配。
此外,两者之间没有可用于联接的公共列。
基本上是从另一列 table.
的一列中搜索子串
任何人都可以建议我该怎么做吗?感谢您的 KQL-fu。
有两种不同的方法可以解决这个问题:
方法 #1 - 如果 LookupDomains 不超过 1,000,000 条记录,则此方法有效:
let Urls = datatable(url: string) [
"happydomain.com",
"a.happydomain.com",
"b.happydomain.com",
"angrydomain.com",
"a.angrydomain.com",
"q1.a.angrydomain.com",
"q2.a.angrydomain.com",
"b.angrydomain.com",
"q1.b.angrydomain.com",
"q2.b.angrydomain.com",
"surpriseddomain.co.il",
"a.surpriseddomain.co.il",
"b.surpriseddomain.co.il",
"q1.a.surpriseddomain.co.il",
"q2.b.surpriseddomain.co.il",
];
let LookupDomains = datatable(domain: string) [
"happydomain.com",
"a.angrydomain.com",
"q1.a.surpriseddomain.co.il"
];
Urls
| extend dl = split(url, ".")
| extend dl1 = tostring(dl[-1])
| extend dl2 = strcat(dl[-2], ".", dl1)
| extend dl3 = strcat(dl[-3], ".", dl2)
| extend dl4 = strcat(dl[-4], ".", dl3)
| extend dl5 = strcat(dl[-5], ".", dl4)
| extend LoopupDomain =
case(dl1 in (LookupDomains), dl1,
dl2 in (LookupDomains), dl2,
dl3 in (LookupDomains), dl3,
dl4 in (LookupDomains), dl4,
dl5 in (LookupDomains), dl5,
"")
| where isnotempty(LoopupDomain)
| project-away dl*
输出:
url
LoopupDomain
happydomain.com
happydomain.com
a.happydomain.com
happydomain.com
b.happydomain.com
happydomain.com
a.angrydomain.com
a.angrydomain.com
q1.a.angrydomain.com
a.angrydomain.com
q2.a.angrydomain.com
a.angrydomain.com
q1.a.surpriseddomain.co.il
q1.a.surpriseddomain.co.il
如果 LookupDomains
table 的记录超过 1,000,000 条,则上述 in
方法将不起作用,必须使用下一种方法。
方法 #2 - 无论 LookupDomains 中的记录数量如何,此方法都有效,但需要您多做一些工作:
首先,您需要将 dl2
作为单独的列添加到 Urls
和 LookupDomains
table 中(这可以作为摄取的一部分完成流,或使用 Update policy).
然后你需要使用下面的查询而不是我上面写的查询:
LookupDomains
| join kind=inner Urls on dl2
| extend dl = split(url, ".")
| extend dl1 = tostring(dl[-1])
| extend dl3 = strcat(dl[-3], ".", dl2)
| extend dl4 = strcat(dl[-4], ".", dl3)
| extend dl5 = strcat(dl[-5], ".", dl4)
| where (dl1 == domain) or (dl2 == domain) or (dl3 == domain) or (dl4 == domain) or (dl5 == domain)
| project-away dl*
我在 Azure 中有两个 table,其中一个是 URL 的列表,另一个只有域名。我希望能够检查 URLtable 中的 URL 是否“包含”DomainName_table 中的域名。 不能使用“in”运算符,因为永远不会有完全匹配。 以下虚拟 tables:
let DomainName_table= datatable (domainname: string)
[
"abc456",
"gmail"
]
|summarize domainlist = make_list(domainname);
let URLtable= datatable (URL: string)
[
"abc456/.com/ffsfd/sdfsdfds",
"gmail",//.com/sAFSfS"
"gmddail.com"///sAFfsdfsfSfS"
];
URLtable
| where URL in (DomainName_table)
我也试过拆分URL来提取域名:
let DomainName_table= datatable (domainname: string)
[
"abc456",
"gmail"
]
|summarize domainlist = make_list(domainname);
let URLtable= datatable (URL: string)
[
"https://abc456.com/ffsfd/sdfsdfds",
"https://gmail.com/sAFSfS"
"https://gmddail.com/sAFfsdfsfSfS"
];
URLtable
|extend split_url = split(URL,"/",2)//| project split_url
| where split_url in (DomainName_table)
这也不是一个好方法,因为它也可以是“xyz.abc456.com”并且不会 return 匹配。几乎总是 return a 0 因为 URL 永远不可能完全匹配。
此外,两者之间没有可用于联接的公共列。 基本上是从另一列 table.
的一列中搜索子串任何人都可以建议我该怎么做吗?感谢您的 KQL-fu。
有两种不同的方法可以解决这个问题:
方法 #1 - 如果 LookupDomains 不超过 1,000,000 条记录,则此方法有效:
let Urls = datatable(url: string) [
"happydomain.com",
"a.happydomain.com",
"b.happydomain.com",
"angrydomain.com",
"a.angrydomain.com",
"q1.a.angrydomain.com",
"q2.a.angrydomain.com",
"b.angrydomain.com",
"q1.b.angrydomain.com",
"q2.b.angrydomain.com",
"surpriseddomain.co.il",
"a.surpriseddomain.co.il",
"b.surpriseddomain.co.il",
"q1.a.surpriseddomain.co.il",
"q2.b.surpriseddomain.co.il",
];
let LookupDomains = datatable(domain: string) [
"happydomain.com",
"a.angrydomain.com",
"q1.a.surpriseddomain.co.il"
];
Urls
| extend dl = split(url, ".")
| extend dl1 = tostring(dl[-1])
| extend dl2 = strcat(dl[-2], ".", dl1)
| extend dl3 = strcat(dl[-3], ".", dl2)
| extend dl4 = strcat(dl[-4], ".", dl3)
| extend dl5 = strcat(dl[-5], ".", dl4)
| extend LoopupDomain =
case(dl1 in (LookupDomains), dl1,
dl2 in (LookupDomains), dl2,
dl3 in (LookupDomains), dl3,
dl4 in (LookupDomains), dl4,
dl5 in (LookupDomains), dl5,
"")
| where isnotempty(LoopupDomain)
| project-away dl*
输出:
url | LoopupDomain |
---|---|
happydomain.com | happydomain.com |
a.happydomain.com | happydomain.com |
b.happydomain.com | happydomain.com |
a.angrydomain.com | a.angrydomain.com |
q1.a.angrydomain.com | a.angrydomain.com |
q2.a.angrydomain.com | a.angrydomain.com |
q1.a.surpriseddomain.co.il | q1.a.surpriseddomain.co.il |
如果 LookupDomains
table 的记录超过 1,000,000 条,则上述 in
方法将不起作用,必须使用下一种方法。
方法 #2 - 无论 LookupDomains 中的记录数量如何,此方法都有效,但需要您多做一些工作:
首先,您需要将 dl2
作为单独的列添加到 Urls
和 LookupDomains
table 中(这可以作为摄取的一部分完成流,或使用 Update policy).
然后你需要使用下面的查询而不是我上面写的查询:
LookupDomains
| join kind=inner Urls on dl2
| extend dl = split(url, ".")
| extend dl1 = tostring(dl[-1])
| extend dl3 = strcat(dl[-3], ".", dl2)
| extend dl4 = strcat(dl[-4], ".", dl3)
| extend dl5 = strcat(dl[-5], ".", dl4)
| where (dl1 == domain) or (dl2 == domain) or (dl3 == domain) or (dl4 == domain) or (dl5 == domain)
| project-away dl*