Запрос и / или поиск идентификатора документа SharePoint

У нас есть среда sharepoint 2010 с включенным идентификатором документа.

Учитывая (часть) идентификатора документа, мы хотим программно получить документы, соответствующие этому идентификатору. Проблема, похоже, в том, что этот столбец довольно особенный и может потребовать особой обработки.

При использовании SPSiteDataQuery получение поля _dlc_DocId как части полей просмотра работает нормально. Однако его включение в запрос where никогда не приводит к получению каких-либо документов.

Использование Search API ни к чему не привело.

Кто-нибудь справился с этим или какие-либо предложения о том, как решить эту проблему?

[Обновление] Оказывается, нас обманули незаметные ошибки в XML и неверные интерпретации при отладке. Этот материал отлично работает.


person Paul-Jan    schedule 04.06.2010    source источник


Ответы (3)


Обычно я не участвую в подобных вещах, потому что люди более умные, чем я, всегда добираются до меня, но поскольку это старый вопрос, на который нет правильного ответа, я думаю, что добавлю свои мысли для тех, кто нашел эту страницу.

Я боролся с этим, но после того, как немного покопался и немного изучил Caml, у меня все заработало. Я использую клиентскую объектную модель SharePoint против SharePoint 2010 и бета-версии Office365.

Начните свой запрос с просмотра запроса всех элементов списка:

Microsoft.SharePoint.Client.CamlQuery.CreateAllItemsQuery (). ViewXml

"<View Scope=\"RecursiveAll\">\r\n <Query>\r\n </Query>\r\n</View>"

Вставьте дочерний элемент where внутрь запроса

Затем добавьте

<Eq><FieldRef Name="_dlc_DocId" /><Value Type="Text">MDXC2KE55ASN-3-80</Value></Eq>

заменив MDXC2KE55ASN-3-80 идентификатором документа, который вы ищете внутри файла where.

Также не забывайте, что вы тоже можете использовать их:

<ViewFields><FieldRef Name="_dlc_DocId" /></ViewFields>

<RowLimit>1</RowLimit>

Затем используйте метод List.GetItems (), чтобы вернуть ListItemCollection.

person OneOff    schedule 14.06.2011
comment
Вы правы, спасибо, что нашли время опубликовать свой ответ. Задав вопрос, мы поняли, что он действительно работает, именно так, как вы его описываете (этот код уже давно запущен в производство). Мы просто запрашиваем объектную модель SharePoint напрямую, а не через вызов веб-службы. - person Paul-Jan; 15.06.2011

На всякий случай никто не придет с умными решениями из недр инфраструктуры Sharepoint:

Что бы сделал Google?

Slice is, Нарезать кубиками и сбросить в обратном индексе.

Solr и Lucene предлагают для этого превосходные инструменты. Идея состоит в том, чтобы разрезать DocId на небольшие части и добавить местоположение документа в корзину для этого фрагмента.

Скажем, у нас есть «Хороший документ» с идентификатором ABCD123. Вы бы добавили это в ведра

ABCD, BCD1, CD12, D123

При поиске частичного идентификатора (+ другие данные, такие как даты, типы, ...) вы (ну, поисковая система) создаете объединение сегментов + применяете дополнительные ограничения.

Чтобы это произошло, вам нужно написать паука для сервера sharepoint и процедуру, которая делает запись элементов данных для индексации.

Поместите красивый интерфейс REST перед ним (на самом деле у SOLR он уже есть), интегрируйте его в основной сервер sharepoint, и никому не нужно знать, что за ним что-то еще работает.

Эти продукты также могут постепенно обновлять индексы, чтобы их можно было поддерживать в актуальном состоянии.

person Peter Tillemans    schedule 11.06.2010

вы можете использовать следующее, чтобы получить идентификатор документа.

SPFile file = MethodToUploadFileToServer (веб, путь к файлу); SPListItem item = file.Item; строка DocID = item.Properties ["_ dlc_DocId"]. ToString ();

person Community    schedule 01.12.2010