在没有 IN 运算符的另一个表的列中搜索一列的子字符串

问题描述

我在 Azure 中有两个表,其中一个是 URL 列表,另一个只有域名。我希望能够检查 URLtable 中的 URL 是否“包含”来自 DomainName_table 的域名。 不能使用“in”运算符,因为永远不会有完全匹配的结果。 下面的虚拟表:

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)

我也尝试过拆分网址来提取域名:

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”并且不会返回匹配项。几乎总是返回 0,因为 URL 永远不可能完全匹配。

此外,两者之间没有可用于连接的公共列。 基本上是从另一个表的列中搜索一列的子字符串。

谁能建议我如何做到这一点?谢谢你的 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","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*

输出:

网址 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 表有超过 1,000 条记录,那么上面的 in 方法将不起作用,必须使用下一种方法。

方法#2 - 无论 LookupDomains 中有多少记录,此方法都有效,但您需要做更多的工作:

首先,您需要在 dl2Urls 表中添加 LookupDomains 作为单独的列(这可以作为摄取流程的一部分完成,或使用 {{ 3}}).

然后您需要使用以下查询而不是我上面写的查询:

LookupDomains
| join kind=inner Urls on dl2
| extend dl = split(url,".")
| extend dl1 = tostring(dl[-1])
| extend dl3 = strcat(dl[-3],dl4)
| where (dl1 == domain) or (dl2 == domain) or (dl3 == domain) or (dl4 == domain) or (dl5 == domain)
| project-away dl*

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...