Liferay 搜索 Portlet 定制

Liferay Search Portlet Customization

我有一个要求,我需要以这种方式覆盖 Liferay 默认搜索功能,无论何时用户搜索它都应该以下列方式工作:

已经有一些第三方 restful 服务可用,return 任何搜索关键字的结果,假设搜索关键字工作是 "Test",如果我们通过 "Test" 给第三方服务,它将return结果以json的形式显示,我们需要在搜索结果页面中显示。

我计划通过以下方式实现这一目标,但想从你们那里知道我的做法是否正确。

第 1 步:我将创建一个挂钩项目,我将在其中覆盖 main_search_result_form.jsp 以格式化结果页面。

第 2 步:我将创建一个索引器,我将在其中实施并使用搜索关键字调用 restful 服务,我将 return 结果 json 对象。

第 3 步:我将在 main_search_result_form.jsp 中获取 json 并且我将基于在 json 输出

想知道我的做法是否正确

我的建议是创建一个新的 portlet,不要挂钩现有的搜索 portlet,原因如下:

-Liferay 搜索 portlet 的强大之处在于使用 Apache Lucene 搜索引擎来搜索和索引门户内容、实体...并且由于您不希望从门户中获得搜索结果,因此它将无用挂钩。

-搜索 portlet jsp 是用特定的呈现逻辑编码的,该逻辑可能与您的逻辑不同(特别是 json 结果)所以我认为您将不得不做大对那些 jsp 进行修改,这将是一项开销。

-您的需求相对简单(使用搜索词参数调用 Web 服务获取结果并呈现它们)。

所以我认为一个简单的 Liferay MVC portlet 将是您更好的选择。

用自定义搜索 portlet 替换主题默认搜索

不,你不需要钩子。 您可以通过如下编辑 portal_normal 文件来替换主题搜索字段:

替换

$theme.journalContentSearch()

## Set the portlet preferences if you need  ##
#set ($VOID = $velocityPortletPreferences.setValue('display-style', '1'))
#set ($VOID = $velocityPortletPreferences.setValue('portlet-setup-show-borders', 'false'))

#set ($instanceId = 'A2R4')
#set ($portletId = 'YOUR_CUSTOM_SEARCH_PORTLET_ID')
#set ($myPortlet = "${portletId}_INSTANCE_${instanceId}")

$theme.runtime($myPortlet, '', $velocityPortletPreferences.toString())

#set ($VOID = $velocityPortletPreferences.reset())

Lifray 将搜索(实际上是索引)用于许多其他事情,而不仅仅是搜索 portlet。如果您只更换它的零碎部分,某些东西可能会停止工作。

好消息是 Liferay 具有可插入搜索功能。在 6.2 中,它默认使用嵌入式 Lucene,但您可以将其替换为 Solr。你可以看看solr-web plugin for example to see how that is implemented. Particularly see how beans are wired with search configuration in solr-spring.xml

也就是说,我想您几乎没有什么选择可以实现您想要的:

  • 基于您的自定义服务完全实现一个新的搜索插件,它可以索引和搜索 Liferay 希望被索引的每个实体。
  • 实施一个新的搜索插件,它将以某种方式区分 "your" 搜索和 "internal" search/index 并将请求发送到不同的地方
  • 实现你自己的 portlet,它独立于 Liferay 的搜索来做你想做的事