dnn 7+搜索没有索引自定义模块项

时间:2014-07-23 19:10:34

标签: vb.net lucene dotnetnuke dotnetnuke-module dotnetnuke-7

我在本地计算机上运行dnndev.me下的dnn 7.2.2开发站点。我创建了一个简单的产品目录模块,并尝试集成新的搜索dnn 7。

以下是我的功能/业务控制器中的ModuleSearchBase的实现

Imports DotNetNuke.Entities.Modules
Imports DotNetNuke.Services.Exceptions
Imports DotNetNuke.Services.Search
Imports DotNetNuke.Common.Globals

Namespace Components

    Public Class FeatureController
        Inherits ModuleSearchBase
        Implements IUpgradeable


        Public Overrides Function GetModifiedSearchDocuments(moduleInfo As ModuleInfo, beginDate As Date) As IList(Of Entities.SearchDocument)

         Try

            Dim SearchDocuments As New List(Of Entities.SearchDocument)

            'get list of changed products
            Dim vc As New ViewsController
            Dim pList As List(Of vw_ProductList_Short_Active) = vc.GetProduct_Short_Active(moduleInfo.PortalID)

            If pList IsNot Nothing Then
                ''for each product, create a searchdocument
                For Each p As vw_ProductList_Short_Active In pList

                    Dim SearchDoc As New Entities.SearchDocument

                    Dim ModID As Integer = 0
                    If p.ModuleId Is Nothing OrElse p.ModuleId = 0 Then
                        ModID = moduleInfo.ModuleID
                    Else
                        ModID = p.ModuleId
                    End If

                    Dim array() As String = {"mid=" + ModID.ToString, "id=" + p.ProductId.ToString, "item=" + Replace(p.Name, " ", "-")}
                    Dim DetailUrl = NavigateURL(moduleInfo.TabID, GetPortalSettings(), "Detail", array)

                    With SearchDoc
                        .AuthorUserId = p.CreatedByUserId
                        .Body = p.ShortInfo
                        .Description = p.LongInfo
                        .IsActive = True
                        .PortalId = moduleInfo.PortalID
                        .ModifiedTimeUtc = p.LastUpdatedDate
                        .Title = p.Name + " - " + p.ProductNumber
                        .UniqueKey = Guid.NewGuid().ToString()
                        .Url = DetailUrl
                        .SearchTypeId = 2
                        .ModuleId = p.ModuleId
                    End With

                    SearchDocuments.Add(SearchDoc)
                Next

                Return SearchDocuments

            Else
                Return Nothing
            End If

        Catch ex As Exception
            LogException(ex)
            Return Nothing
        End Try

        End Function
    End Class

End Namespace

我清除了网站缓存,然后我手动启动了搜索重新索引。我可以从主机计划历史中看到重新索引已运行并完成。

问题

上述代码中的所有项目都未添加到索引中。我甚至使用Luke Inspector查看lucene索引并确认这些项目没有添加。

问题

我需要帮助找出为什么这些项目没有被添加,或者我需要有关如何调试索引以查看在该过程中是否有任何内容运行的帮助。

先谢谢

JK

编辑#1

我在Sql Server中运行了以下过程,以查看模块是否甚至列在搜索模块中:

exec GetSearchModules[PortalId]

相关模块确实出现在此列表中。为featureController调用索引,但结果不会添加到lucene索引中。仍然需要帮助。

编辑#2

所以我升级到7.3.1,希望在安装过程中能解决这个问题。但事实并非如此。搜索文档仍由GetModifiedSearchDocuments函数创建/返回,但文档未添加到Lucene索引中,因此不会出现在搜索结果中。

编辑#3

破解点没有像我想象的那样在升级之后被击中,但是我添加了一个try catch来记录异常,并且当我尝试手动重新索引(清理以保持简短)时会创建以下错误日志

AssemblyVersion:7.3.1
PortalID:-1
PortalName:    
DefaultDataProvider:DotNetNuke.Data.SqlDataProvider, DotNetNuke
ExceptionGUID:d0a443da-3d68-4b82-afb3-8c9183cf8424
InnerException:Sequence contains more than one matching element
Method:System.Linq.Enumerable.Single
StackTrace:
Message:
System.InvalidOperationException: Sequence contains more than one matching element
   at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
   at DotNetNuke.Services.Scheduling.Scheduler.CoreScheduler.LoadQueueFromTimer()
   at DotNetNuke.Services.Scheduling.Scheduler.CoreScheduler.Start()
Source:
Server Name: KING-PC

编辑#4

好的,我在This Disucssion on the DNN issue tracker之后的编辑三中解决了问题,但仍未向lucene索引添加任何项目。

断点被击中,一旦我让调试器运行一段时间,我得到以下错误:

  

{“类型'Lucene.Net.Index.MergePolicy + MergeException'的异常是   抛出。“} {”无法覆盖:   C:\网站\ dnndev.me \程序App_Data \搜索\ _1f0.fdt“}

看起来像是权限错误。我会看到我可以解决的问题

1 个答案:

答案 0 :(得分:3)

J King,

我刚刚在Implementing Search in your Module上完成了关于DNNHero.com的系列文章。第3和第4部分正在实现和调试ModuleSearchBase实现。

编辑:删除您在实施中对SearchTypeId的作业

此外,这里有一个示例代码段,以了解我如何设置SearchDocument的属性。再次,观看我的视频,了解搜索实施中的一大堆其他潜在缺陷。

        SearchDocument doc = new SearchDocument
        {
            UniqueKey = String.Format("{0}_{1}_{2}",
                    moduleInfo.ModuleDefinition.DefinitionName, moduleInfo.PortalID, item.ItemId),
            AuthorUserId = item.AssignedUserId,
            ModifiedTimeUtc = item.LastModifiedOnDate.ToUniversalTime(),
            Title = item.ItemName,
            Body = item.ItemDescription,
            Url = "",
            CultureCode = "en-US",
            Description = "DotNetNuclear Search Content Item",
            IsActive = true,
            ModuleDefId = moduleInfo.ModuleDefID,
            ModuleId = item.ModuleId,
            PortalId = moduleInfo.PortalID,
            TabId = tab
        };