提前感谢您的阅读以及您提供的任何帮助!
我正在尝试对多个邮箱进行邮箱搜索。我需要查找所有提到某些词且未提及其他词的消息,除非这些词同时出现在两个列表中。这是一个复杂的搜索。我不知道如何扭曲关键字查询语言逻辑来实现这一点。
我知道搜索命令会很复杂,而且运行时间会很长。没关系。
示例:
搜索提及 Teddy 的项目。
我想要提及 Roosevelt 的项目。我想要提及 mugwump 的项目
我想要提及 Rough Riders 的项目
我不想要提及 Franklin Roosevelt 的任何内容。
但是,如果一条消息同时提及 Teddy 和 Franklin,我需要它。
我不想要主题中带有“new-deal”的任何内容
我不想要提及 Truman 的任何内容。
我想要包含通配符。
搜索“罗斯福”肯定会出现“富兰克林”。我不能单方面排除“富兰克林”,否则会错过一些“泰迪”
我当前的查询:
New-MailboxSearch -SearchQuery "Teddy* OR mugwump* OR Roosevelt* OR 'Rough Riders*' NOT ((Franklin* NOT Teddy*) OR Truman* OR subject:'new-deal')"
执行了上述搜索。共收到 9,500 条结果。我发现一些电子邮件中含有“mugwump”和“franklin pierce”。这里有些不对劲。
当我运行“Teddy* OR Roosevelt*”时,我收到了 10,000 次点击。
当我运行“Teddy* OR Roosevelt* NOT (Franklin* NOT Teddy*)”时,我收到了 9,500 次点击。所以我认为它有效吗?
如果是括号问题,我还尝试了“(Teddy* OR Roosevelt*) NOT (Franklin* NOT Teddy*)”。我仍然得到了 9,500 个结果。
将正面搜索词括起来没有任何效果。
然后我尝试了“(Teddy* OR Roosevelt*) NOT (Franklin*)”我仍然得到了 9,500 次匹配。结果中有 Franklin,所以这里确实有些不对劲。
这是引号问题吗?我找不到关于单引号 ' ' 与双引号 " " 的清晰文档,以及它们如何影响搜索运算符和括号。
微软的 KQL 文档没有提到它。大多数 Google 的 KQL 匹配结果都是针对 Sharepoint 的,它与 Exchange 相比具有不同的倾向(和选项)。许多 Exchange 匹配结果实际上是针对 AQS 的。
我还没有找到像我这样的带有嵌套搜索词的复杂 KQL 查询的良好示例......
我尝试将所有单引号替换为双引号。它使我的结果减少到 4,000。这只是一个 -EstimateOnly,我还没有机会运行实际作业并检查结果。
1. “NOT (Franklin* NOT Teddy*)” 双重否定会不会出错?
2. 有没有其他方式来表达“包括这个,除非它还包括那个”?
3. 有没有更好的方法来排列括号?
4. 我的引用有什么问题吗?
谢谢你的帮助!
答案1
我找到了解决方案。我想分享我的最后一个疑问,以及我在此过程中学到的一些重要经验教训。
第 1 课。如何实现多个括号语句
查询中只能使用一个括号。但是,您可以在该查询中嵌套另一组括号。
例如:-SearchQuery "(a OR b) AND (c OR d)"
将产生错误
例如:-SearchQuery "a AND (b AND (c OR d))"
有效
我不知道您是否可以在父级中使用多个括号,或者是否可以向下嵌套第三级。不必弄清楚。
第 2 课。多个 AND/OR 操作数
坦白说,我从未弄清楚操作数的顺序是否会影响 SearchQuery 解析结果的方式。我的最终查询主要由 OR 语句组成,因此我没有花时间深入研究它。
例如:-SearchQuery "a AND b OR c AND d"
- 这是否等同于“(a AND b) OR (c AND d)”?
- 或者这是否等同于“a AND (b OR c) AND d”?
我不知道。没必要弄清楚。
这是未来读者需要记住的事情。
课程 3. 使用 {__} '__' "__" 包装搜索查询术语
您可以使用 { }、' ' 或 " " 包装搜索查询。
-SearchQuery {wordone OR wordtwo OR "word three"}
-SearchQuery 'wordone OR wordtwo OR "word three"'
-SearchQuery "wordone OR wordtwo OR 'word three'"
我认为每个包装器解析查询中带有引号/双引号或通配符的文字术语的方式可能存在一些特殊之处。我对现场测试有些不确定,这让我这么想。
当我创建一个包含一小组测试消息的测试邮箱进行实验时,我已经决定使用带有双引号的单引号。当我弄清楚什么有效时,我就是这么用的,所以我再也没有回去进行进一步的实验。
测试邮箱
我创建了一个测试邮箱。我向该邮箱发送了 16 封电子邮件。
每封电子邮件的主题都是“(01 到 16)(好或坏)”。
每封电子邮件的正文都包含基于真实示例的各种模式的搜索词。
理想的模式电子邮件在主题中使用“好”,不理想的模式使用“坏”。
例如:主题:“05 好”,正文:“Roosevelt mugwump”
例如:主题:“07 坏”,正文:“Franklin Roosevelt”
例如:主题:“08 好”,正文:“Teddy Franklin Roosevelt”
如果我的查询结果返回任何“坏”电子邮件,我就知道它失败了。
如果我的查询结果没有返回“好”电子邮件,我就知道它失败了。
我使用这个环境来找出逻辑并修剪不需要的结果。
最后 -SEARCHQUERY
使用该测试邮箱和上述课程,我构建了以下查询:
New-MailboxSearch -Name 2019Feb7test13 -Force -SourceMailboxes user1,user2,user3 -StartDate 1/1/1890 -EndDate 1/1/1940 -SearchQuery 'teddy* OR roosevelt* OR mugwump* OR "rough riders*" NOT (franklin* NOT (teddy* OR mugwump* OR "rough riders")) NOT "new-deal" NOT truman*' -TargetMailbox discoveryresults -TargetFolder 2019Feb7test13 -ExcludeDuplicateMessages $true -LogLevel Full -StatusMailRecipients me
(我的真实查询比这稍微复杂一些,但这个例子可以说明我的解决方案。)
将此 -SearchQuery 分开,我们有:
匹配以下任何一项:teddy、roosevelt、mugwump、rough riders
不匹配:new-deal、truman
不匹配:franklin,当它不匹配 teddy、mugwump、rough riders 时
第一个条件会选出所有“roosevelt”,包括“franklin roosevelt”。
第三个条件会丢弃所有包含“franklin”但不包括 teddy、mugwump 或 rough riders 的单词。
备份计划
如果我找不到这个问题的解决方案,我的备份计划将分为两部分。1
. 不进行任何过滤进行搜索。只使用正或条件。将结果发送到临时邮箱,而不是发现框。2
. 在该临时邮箱上运行搜索邮箱。找到所有与我不想要的条件匹配的项目,然后使用 -DeleteContent 开关。
这可能有用,但需要额外的努力。我对我的解决方案非常满意。
答案2
根据您的要求,过滤范围为“提及 Teddy Roosevelt 的项目”,包括“同时提及 Teddy 和 Franklin 的项目”。您可以简化 cmdlet,如下所示:
New-MailboxSearch -SearchQuery 'Teddy* OR mugwump* OR Roosevelt* OR Rough Riders* NOT (Truman* OR subject:"new-deal")'