【问题标题】:Can I search/index a custom datasource in Orchard via Lucene?我可以通过 Lucene 在 Orchard 中搜索/索引自定义数据源吗?
【发布时间】:2013-08-12 14:53:48
【问题描述】:

我目前正在开发一个允许用户搜索自定义产品目录的网站。我一直在环顾四周,很想利用 Orchard CMS 来帮助我开发这个网站。我目前已经通过 Ron Petersons youtube series 自定义果园模块和 Skywalker blog series

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

这是我目前的情况:

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

  2. 我有一个自定义 DAL,它指向另一个 SQL 数据库(名为 Products)。

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

  4. 自定义 DAL 有一个名为 Product 的 POCO 模型(带有一个用于 与)与属性名称、描述、价格交互。

现在,根据我阅读的有关创建 Orchard 模块的信息,创建具有自定义内容的自定义模块的方法似乎是:

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

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

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

  4. 创建一个自定义 ContentPartHandler (ProductPartHandler) 来处理 Content Part 的持久性。

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

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

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

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

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

【问题讨论】:

  • 您是否希望将您的产品转换为内容项?
  • 我希望能够直接从产品目录中读取,但如果这不可行,那么是的,我可以转换。每个产品有大约 12 个属性,但我只需要能够搜索其中的 3 或 4 个。我正在玩弄的一个选项是我可以创建一个具有这些可搜索属性的自定义 ProductPart。然后,当我需要所有信息时(例如在产品详细信息页面上),我会执行以下操作:stackoverflow.com/questions/4727843/….
  • 这需要我有一个同步过程来将产品目录中的数据同步到 Orchard db,我想避免这种情况,但如果这是我能做到的最好方法。
  • 好吧,您必须为所有产品创建内容项,我想您可以在每次显示项目时链接到远程源并在索引时公开这些字段。听起来可行,尽管恐怕我从未真正使用过索引 api。但我会说将您的产品转换为实际内容项目会更清洁。也许。 ^_^
  • 您可以告诉索引器您希望在处理程序中为该特定内容部分索引哪些字段。我过去遇到的问题是我无法创建包含未在数据库中创建的字段的内容部分。 NHibernate 会查找那些不存在的列,最终我必须使用迁移类来创建它们。

标签: c# .net orchardcms


【解决方案1】:

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

  1. 创建果园模块
  2. 通过迁移创建新的内容部分/类型
  3. 使用 Orchard Command 基础架构从辅助数据库导入数据
  4. 在 Content Part 处理程序中使用 OnIndexing 事件以允许 Lucene 索引您的数据源。
  5. 创建一个查找属性(我称为 ConcreateProperty),该属性通过我在模块中创建的服务填充,以与 OnLoaded 事件中的辅助 DAL 交互。

我的最终处理程序如下所示:

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()
          );
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2011-12-20
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多