【问题标题】:EWS API Search Filter does not return all informationEWS API 搜索过滤器不返回所有信息
【发布时间】:2016-11-09 13:03:17
【问题描述】:

我有以下情况: 我检查了一个邮箱,其中包含一些相关信息的电子邮件被发送到该邮箱,以从中获取信息。

我使用了很多搜索过滤器来查找特定的电子邮件并获得正确的电子邮件:

var collection = new SearchFilter.SearchFilterCollection(LogicalOperator.And);
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text1", ContainmentMode.Substring, ComparisonMode.Exact));
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text2", ContainmentMode.Substring, ComparisonMode.Exact));
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text3", ContainmentMode.Substring, ComparisonMode.Exact));
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text4", ContainmentMode.Substring, ComparisonMode.Exact));
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text5", ContainmentMode.Substring, ComparisonMode.Exact));
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "longer string 1", ContainmentMode.Prefixed, ComparisonMode.IgnoreCase));

但现在我遇到的问题是我并不总是能找到正确的电子邮件。我非常简单地测试了这一点:我向我正在轮询的邮箱发送了一条消息,该邮箱看起来与另一条消息完全一样。在这两种情况下,上面的所有信息都包括在内。 但是,在我更改了 SearchFilters 上的某些内容或任何内容后,我突然看到了正确的结果,即最新消息。

我不知道是什么导致了这个问题,因为它太不通用了。

【问题讨论】:

    标签: c# .net exchangewebservices ews-managed-api


    【解决方案1】:

    您的查询看起来非常复杂,并且在服务器性能方面会非常昂贵。例如,您的搜索过滤器将需要转换为 MAPI 限制,然后应用到服务器 https://technet.microsoft.com/en-us/library/cc535025(v=exchg.80).aspx,我怀疑您继续应用多个子字符串的方式是否可靠,除非您查询的数据集非常小。因为限制是由服务器缓存的,所以您看到的行为可能只是后端构建或刷新限制所花费的时间。 (例如,如果您再次查询相同的内容并获得表明缓存结果的非常快速的响应)或者它只是强制创建新项目的过程,即首先查找最新项目。

    通过使您的搜索过滤器更简单并在客户端处理更多项目,文本可以通过许多不同的方法处理,您会得到更好的服务。或者看看使用 AQS(或 2013 年的 KQL)https://msdn.microsoft.com/en-us/library/office/dn579420(v=exchg.150).aspx 然后对内容索引进行关键字查询(这是搜索过程的优化目标)。虽然您可能会得到更多的误报,但它应该更快、更可靠,并且在客户端过滤误报也容易得多。

    如果你想使用 Rest Cache,你需要使用 Raw Soap,因为我不相信 Managed API 会支持它。它是 QueryString 元素的一个属性,例如

        <?xml version="1.0" encoding="utf-8"?>
        <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                       xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
                       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
                       xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
          <soap:Header>
            <t:RequestServerVersion Version="Exchange2010" />
          </soap:Header>
          <soap:Body>
            <m:FindItem Traversal="Shallow">
              <m:ItemShape>
                <t:BaseShape>IdOnly</t:BaseShape>
                <t:AdditionalProperties>
                  <t:FieldURI FieldURI="item:Subject" />
                </t:AdditionalProperties>
              </m:ItemShape>
              <m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
              <m:ParentFolderIds>
                <t:DistinguishedFolderId Id="inbox" />
              </m:ParentFolderIds>
              <m:QueryString ResetCache="true">subject:Autodiscover</m:QueryString>
            </m:FindItem>
          </soap:Body>
        </soap:Envelope>
    

    【讨论】:

    • 谢谢,这至少有助于找到最多的项目。但似乎他正在缓存结果,因为再次:我调用查询字符串搜索,得到最新的结果,然后我发送另一封电子邮件,现在结果不包括最新的电子邮件。但是当我再次搜索时,我找到了最新的项目,就像我不知道有什么缓存方式一样。您可能知道如何在查询字符串中使用“ResetCache”标志,就像 MSDN 中提到的那样?
    • 想要追加:似乎有某种延迟。如果我等待 1 或 2 分钟,我会直接得到正确的结果。我不理解这种行为,因为 Outlook 似乎可以直接获取信息,但 EWS 结果似乎不是最新的或不同的......
    • 我已经用使用 ResetCache 的示例更新了我的答案。内容索引是一个后台进程,因此查询字符串将查询的 Ci 索引总是会滞后一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2020-03-29
    • 2013-06-26
    • 2013-09-11
    • 2021-02-23
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多