2016-01-14 7 views
0

Я работаю над кодом C#, который извлекает все пути семейства сайтов с сервера On-Premise Sharepoint 2013. У меня есть следующие коллекции сайта на сервере:Не все коллекции сайтов отображаются в результатах - Sharepoint 2013 Поиск по CSOM

/ServerURL/
/ServerURL/мой
/ServerURL/мой/личный/site1
/ServerURL/мой/личный/site2
/ServerURL/сайты/
тестовый сайт/ServerURL/custompath/site3

когда я запускаю мой код, я получаю только следующие семейства сайтов:
/ServerURL/
/ServerURL/мой
/serverurl/my/personal/site1
/serverurl/my/personal/site2
Мне было интересно, почему мой поиск не возвращает все семейства сайтов?
вот мой код:

ClientContext context = new ClientContext(siteUrl); 
var cred = new NetworkCredential(userName, password, domain); 
context.Credentials = cred; 
KeywordQuery query = new KeywordQuery(context); 
query.QueryText = "contentclass:STS_Site"; 
SearchExecutor executor = new SearchExecutor(context); 
query.TrimDuplicates = true; 
var resultTable = executor.ExecuteQuery(query); 
context.ExecuteQuery(); 
foreach (var row in resultTable.Value[0].ResultRows) 
{ 
    string siteName = row["siteName"] as string; 
    Console.WriteLine("Site Name: {0}", siteName); 
} 

Спасибо!

+0

Вы уверены, что указали свой поиск? В центральном администраторе вы можете проверить в приложении службы поиска историю сканирования и посмотреть, есть ли какие-либо элементы из вашего отсутствующего сайта коллекции. –

+0

Недостающие коллекции сайтов существуют в индексе поиска. если Iuse запрос: «путь: serverurl/sites/TestSite», я получаю недостающий набор сайтов, но запрос «contentclass: STS_Site» должен возвращать все семейства сайтов, которых нет. Я думаю, что это как-то связано с разрешениями serach, но я не знаю, как это исправить –

ответ

0

У меня была такая же проблема сегодня. Я нашел два решения.

Независимо от того, на вашем рабочем столе или на Office365, мы можем использовать dll Microsoft.Online.SharePoint.Client.Tenant. Вы можете использовать это, чтобы получить все коллекции сайтов. Вам нужны ваши администраторы, чтобы запускать какую-то оболочку питания, если вы на самом деле. Vesa была достаточно хороша, чтобы написать блог об этом here

Как только вы это сделаете, вы можете сделать что-то вроде следующего (Примечание: я не тестировал этот метод с помощью учетной записи не администратора) (решение взято из here) К сожалению этот не будет работать для меня, так как я хочу обрезки безопасности, и этот код должен запускаться пользователем с разрешениями на чтение арендатора, которые наши пользователи обычно не имеют.

var tenant = new Tenant(clientContext); 
SPOSitePropertiesEnumerable spp = tenant.GetSiteProperties(0, true); 
clientContext.Load(spp); 
clientContext.ExecuteQuery(); 
foreach(SiteProperties sp in spp) 
{ 
    // you'll get your site collections here 
} 

Я закончил тем, что делал это, который возвращается к использованию поиска, я все еще есть проблемы, у нас есть более чем 500 сайтов/Полотно поэтому я работаю с нашими админами, чтобы увидеть, если мы можем увеличить максимальные строки поиск можно вернуть. Тем не менее, истинный секрет здесь TrimDuplicates устанавливается на false, я не знаю, почему SP считает, что результаты являются общими, но это очевидно, поэтому установите его в false, и вы должны увидеть все свои сидения.

KeywordQuery query = new KeywordQuery(ctx); 
query.QueryText = "contentclass:\"STS_Site\""; 
query.RowLimit = 500;//max row limit is 500 for KeywordQuery 
query.EnableStemming = true; 
query.TrimDuplicates = false; 
SearchExecutor searchExecutor = new SearchExecutor(ctx); 
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(query); 
ctx.ExecuteQuery(); 
var data = results.Value.SelectMany(rs => rs.ResultRows.Select(r => r["Path"])).ToList(); 

Надежда одна из двух будет работать на вас.