2016-11-09 5 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を使用して、Contentインデックス(検索プロセスが最適化されているもの)のキーワードクエリを実行します。このようにして誤検出が増える一方で、より迅速かつ信頼性の高いものになり、クライアントでの誤検出をより簡単にフィルタリングできるようになります。

Rest Cacheを使用する場合は、Managed APIがサポートしていないと思われるRaw Soapを使用する必要があります。 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索引問合せ文字列は常に少し遅れます。 –

関連する問題