2015-04-30 7 views
0

У меня есть визуальный проект студии с 2 решения: Решение 1: UmbracoCms (Umbraco 7.2 код базы) Решение 2: SeachIndexer (lucene.net пространственно - консольного приложения Windows)Umbraco и индексирование

В моем решении 2 у меня есть ссылки на следующие .dlls из раствора Umbraco:

  • UmbracoCms.dll
  • cms.dll
  • businesslogic.ddl
  • umbraco.dll
  • umbraco.DataLayer.dll

В файле Program.cs У меня есть следующий код:

Node rootNode = new Node(1103); 
string nodeTypeAlias = "articlePage"; 

if (node.NodeTypeAlias == nodeTypeAlias) 
    listNode.Add(node); 

foreach (Node childNode in node.Children) 
{ 
    GetDescendantOrSelfNodeList(childNode, nodeTypeAlias); 
} 

//some other code 

Когда я запускаю код, я получаю следующее сообщение об ошибке:

could not load the umbraco.core.configuration.umbracosettings.iumbracosettingssection from config file 

То, что я пытаюсь сделать, это страницы Umbraco с индексом, использующие Lucene.net-пространственные (Examine не поддерживает пространственные) в отдельном решении, сохраняющем Umbraco ba se code clean. Я хочу, чтобы запланировать SearchIndexer через 15 минут.

Какой лучший способ сделать это?

+0

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

ответ

1

У вас такая ошибка, потому что Umbraco не видит ее конфигураций.

вы могли бы иметь два решения:

Umbraco консоль: это значит воссоздать среду Umbraco в консольном приложении. Вы можете увидеть/использовать this project (например,). Как вы можете видеть, в App.config были воссозданы все конфигурации, необходимые для Umbraco. Я никогда не использовал его раньше (это был мой первый результат в google), но он кажется хорошей отправной точкой.

Прямой доступ к Umbraco DB: если вам не нужно широко использовать API Umbraco, возможно, вам лучше искать свой контент непосредственно в DB Umbraco. Очевидно, вам нужно исследовать базу данных Umbraco, чтобы понять, что искать, и это может быть неудобно, если вы не знаете Umbraco.

+0

Как? извините, я новичок в Umbraco. Я хотел бы реализовать этот урок для страниц Umbraco определенного типа документа. https://www.leapinggorilla.com/Blog/Read/1010/spatial-search-in-lucenenet---worked-example – Huzzi

+0

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

1

Вместо использования проекта консоли и планирования его работы каждые 15 минут воспользуйтесь обработкой содержимого контента Umbraco и индексируйте узел каждый раз, когда он публикуется. Таким образом, ваш индекс обновляется сразу, и вам не придется беспокоиться о внешнем планировании и т.д.

Вот как:

  1. Создать новое решение (я обычно использую пустой веб-проект, но вы можете просто создайте проект библиотеки) и установите пакет UmbracoCms.Core nuget, соответствующий вашей версии UmbracoCms (он установит все необходимые зависимости для вас, включая Examine).
  2. Добавить Лункен.Чистые пакеты согласно учебному пособию
  3. Добавьте класс, полученный от Umbraco.Core.ApplicationEventHandler и переопределите ApplicationStarted - это даст вам доступ к службам Umbraco, а также к событиям проверки индексирования - вы можете использовать либо для этого упражнения - вы можете найти Examine Events более подходящий.
  4. В вашем проекте Umbraco добавить ссылку на свой новый проект, так что получить вытащил в

Ваш класс EventHandler может выглядеть примерно так:.

public class SpacialIndexingEventHandler : ApplicationEventHandler 
{ 
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
    { 
     Umbraco.Core.Services.ContentService.Publishing += ContentService_Publishing; 
    } 

    private void ContentService_Publishing(Umbraco.Core.Publishing.IPublishingStrategy sender, Umbraco.Core.Events.PublishEventArgs<IContent> e) 
    { 
     // For each published node, perform the necessary indexing. 
     string nodeTypeAlias = "ArticlePage"; 
     foreach (var node in e.PublishedEntities.Where(a => a.ContentType.Alias == nodeTypeAlias)) 
     { 
      // Index this 

     } 
    } 
} 

Если вы хотите сделать индексацию когда это Вместо этого используются индексирующие символы Umbraco:

public class SpacialDataIndexingEventHandler : ApplicationEventHandler 
{ 
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 
    { 
     // connect to the GatheringNodeData event of the provider you're interested in: 
     foreach(var provider in ExamineManager.Instance.IndexProviderCollection.AsEnumerable<BaseIndexProvider>()) { 
      if (provider.Name.StartsWith("External")) { 
       provider.GatheringNodeData += provider_GatheringNodeData; 
       break; 
      } 
     } 
    } 

    void provider_GatheringNodeData(object sender, IndexingNodeDataEventArgs e) 
    { 
     if (e.IndexType == IndexTypes.Content) 
     { 
      // Get the Node from the ContentService: 
      var node = ApplicationContext.Current.Services.ContentService.GetById(e.NodeId); 
      // Do your spacial indexing here; 
     } 
    } 
}