我可以通过Lucene在Orchard中搜索/索引自定义数据源吗?

时间:2013-08-12 14:53:48

标签: c# .net orchardcms

我目前正在开发一个网站,允许用户搜索自定义产品目录。我一直在环顾四周,并希望利用Orchard CMS来帮助我开发这个网站。我目前在自定义Orchard模块和Ron Petersons youtube series上进行了Skywalker blog series

我觉得我的目标是可行的,但我正在寻找一些关于我的策略是否适用于Orchard框架的验证。

这是我目前的情况:

  1. 我有一个指向SQL DB的默认Orchard配置(命名为 产品果园)

  2. 我有一个指向另一个SQL DB(名为Products)的自定义DAL。

  3. 产品由您的典型信息组成(产品名称,     描述,价格等。)

  4. 自定义DAL有一个名为Product的POCO模型(带有一个Repository to     与属性名称,描述,价格互动。

  5. 现在,基于我读到的有关创建Orchard模块的信息,似乎创建具有自定义内容的自定义模块的方法是:

    1. 通过代码生成工具创建模块(我们称之为ProductModule)

    2. 创建自定义内容部件(ProductPart)

    3. 创建自定义内容部件记录(ProductPartRecord)以充当部件的数据模型。

    4. 创建一个自定义ContentPartHandler(ProductPartHandler)来处理内容部分的持久性。

    5. 创建一个自定义驱动程序,该驱动程序是准备用于呈现UI的形状的条目。

    6. 可能创建与驱动程序交互的服务?

    7. 这是事情开始变得混乱的地方,我不确定这是否可能。我想要做的是创建一个由我的自定义DAL支持的自定义内容类型,而不是通过Product-Orchard DB中的ContentPartRecord存储数据,但仍允许它由Lucene模块索引以允许用于搜索产品目录。

      是否可以创建由不同数据源支持并仍然利用Lucene搜索功能的自定义ContentType和/或ContentPart?

      在高级术语中,我想要一个Product ContentType,其中ContentItems实际存储在我的辅助数据库中,而不是Orchard数据库中(并且仍然希望能够通过Projections利用Lucene搜索)。

1 个答案:

答案 0 :(得分:7)

对于那些寻找类似答案的人,以下解决方案就是我所确定的。我找不到与单独的DAL交互并执行Lucene索引的简单机制。

  1. 创建Orchard模块
  2. 通过移民创建新的内容部分/类型
  3. 使用Orchard Command基础结构从辅助数据库导入数据
  4. 使用内容部件处理程序中的OnIndexing事件,允许Lucene为您的数据源编制索引。
  5. 创建一个查找属性(我称之为我的ConcreateProperty),该属性通过我在模块中创建的服务填充,以与OnLoaded事件中的辅助DAL进行交互。
  6. 我的最终处理程序看起来像这样:  

    public class HomePartHandler : ContentHandler {
        public HomePartHandler(IRepository<HomePartRecord> repository, IHomeSearchMLSService homeSearchService) {
            Filters.Add(StorageFilter.For(repository));
            OnLoaded<HomePart>((ctx, part) =>
            {
                part.ConcreteProperty = homeSearchService.GetByMlsNumber(part.MlsId) ?? new PropertyDetail();
            });
            OnIndexing<HomePart>((context, homePart) => context.DocumentIndex
             .Add("home_StreetFullName", homePart.Record.StreetFullName).RemoveTags().Analyze().Store()
             .Add("home_City", homePart.Record.City).RemoveTags().Analyze().Store()
             .Add("home_State", homePart.Record.State).RemoveTags().Analyze().Store()
             .Add("home_Zip", homePart.Record.Zip).RemoveTags().Analyze().Store()
             .Add("home_Subdivision", homePart.Record.Subdivision).RemoveTags().Analyze().Store()
             .Add("home_Beds", homePart.Record.Beds).RemoveTags().Analyze().Store()
             .Add("home_Baths", homePart.Record.Baths).RemoveTags().Analyze().Store()
             .Add("home_SquareFoot", homePart.Record.SquareFoot).RemoveTags().Analyze().Store()
             .Add("home_PropertyType", homePart.Record.PropertyType).RemoveTags().Analyze().Store()
             .Add("home_ListPrice", homePart.Record.ListPrice).RemoveTags().Analyze().Store()
             .Add("home_MlsId", homePart.Record.MlsId).RemoveTags().Analyze().Store()
             .Add("home_Latitude", (double)homePart.Record.Latitude).RemoveTags().Analyze().Store()
             .Add("home_Longitude", (double)homePart.Record.Longitude).RemoveTags().Analyze().Store()
              );
        }
    }
    

    这允许我创建一个搜索服务,用于搜索我的所有数据,然后通过Concrete Property将其连接到模型,无论如何,从性能的角度来看,这实际上效果更好。