0

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

已经有一些第三方的restful服务可以返回任何搜索关键字的结果,假设搜索关键字工作是“测试”,如果我们将“测试”传递给第三方服务,它将以json的形式返回结果,我们需要在搜索结果页面中显示。

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

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

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

第 3 步:我将在main_search_result_form.jsp中获取 json,并根据该 json 输出格式化页面

想知道我的做法是否正确

4

2 回答 2

3

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

好消息是 Liferay 有可插入的搜索。在 6.2 中,它默认使用嵌入式 Lucene,但您可以将其替换为 Solr。例如,您可以查看solr-web插件以了解它是如何实现的。尤其是在solr-spring.xml中查看 bean 如何与搜索配置相关联

也就是说,我想你几乎没有选择来实现你想要的:

  • 完全实现基于您的自定义服务的新搜索插件,该插件可以索引和搜索 Liferay 期望被索引的每个实体。
  • 实现一个新的搜索插件,它将以某种方式区分“您的”搜索和“内部”搜索/索引并将请求发送到不同的地方
  • 实现您自己的 portlet,它可以独立于 Liferay 的搜索执行您想要的操作
于 2016-11-28T13:20:30.900 回答
1

我的建议是创建一个新的 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())
于 2016-11-28T13:13:04.440 回答