2016-11-09 1 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)); 

을하지만 지금은 내가 항상 올바른 전자 메일 메시지를 찾을 수없는 문제가있다. 나는 매우 간단하게 테스트했다. 나는 폴링중인 메일 박스에 다른 메시지와 완전히 같은 메시지를 보냈다. 두 경우 모두 위에서 나온 모든 정보가 포함됩니다. 하지만 검색 필터 나 기타 항목에서 뭔가를 변경 한 후에 갑자기 올바른 결과 인 최신 메시지가 표시됩니다.

매우 비논리적이므로 문제의 원인을 알 수 없습니다.

답변

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을 사용하여 콘텐츠 색인의 키워드 쿼리 (검색 프로세스에 최적화 된 내용)를 수행하십시오. 이 방법을 사용하면 오탐 (false positive)이 증가 할 수 있지만 클라이언트에서 오 탐지 (false positive)를 필터링하는 것이 훨씬 쉽고 빠릅니다.

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 인덱스 쿼리 문자열은 항상 약간 지연됩니다. –