2016-11-09 94 views
0

我有以下情形: 我檢查郵箱,其中包含一些相關信息的郵件將被髮送到該郵箱以從中獲取信息。EWS API搜索篩選器不會返回所有信息

我用了很多的搜索過濾器來查找特定電子郵件,以獲得正確的一個:

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或任何東西后,我突然看到正確的結果,最新的消息。

我不知道什麼可能會導致問題,因爲它非常非常。

回答

0

您的查詢看起來非常複雜,在服務器性能方面會非常昂貴。例如,您的搜索過濾器將需要轉換爲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,因爲我不相信託管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> 
+0

謝謝,這有助於至少找到最多的項目。但似乎他正在緩存結果,因爲我再次調用查詢字符串,得到最新的結果,然後發送另一封電子郵件,結果不包含最新的電子郵件。但是當我再次搜索**時,我發現最新的項目,就像我不知道的任何緩存方式。你可能知道如何使用像MSDN中提到的queryString中的「ResetCache」標誌? – Zumarta

+0

想追加:似乎有某種延遲。如果我等待1或2分鐘,我會直接得到正確的結果。我不明白這種行爲,因爲Outlook似乎直接獲取信息,但EWS結果似乎不是最新的或不同的...... – Zumarta

+0

我已經使用ResetCache更新了我的答案。內容索引是一個後臺進程,因此Ci索引查詢字符串查詢將始終滯後一點。 –