Liferay 6.2自定义全文搜索portlet实现

时间:2014-07-02 05:45:31

标签: search liferay-6

我想实现自定义搜索portlet,以便我可以搜索属于自定义结构的属性。 让我们说我做了一个名为“文学”的结构,其中包含作者,内容,标题,注释,部分等属性。 我想创建“高级”搜索,在哪里可以选择特定结构类型(文献,判决或立法),用这些结构类型的另一个属性表示的特定部分(例如,仅选择带有PPV部分的文献或带有部分APS的文献)等

我尝试使用分面搜索,但我没有找到如何将这些结构的属性包含在查询中: 这是我的“搜索”代码:

 SearchContext searchContext = SearchContextFactory.getInstance(httpServletRequest);
 Map<String, Serializable> attributes =    new HashMap<String, Serializable>();
 attributes.put(Field.TITLE, "some word");
 attributes.put("paginationType", "regular");
 searchContext.setAttributes(attributes);

 Facet assetEntriesFacet = new AssetEntriesFacet(searchContext);
 assetEntriesFacet.setStatic(true);            
 searchContext.addFacet(assetEntriesFacet);

 Facet scopeFacet = new ScopeFacet(searchContext);
 scopeFacet.setStatic(true);            
 searchContext.addFacet(scopeFacet);

 String[] entryClassNames = { JournalArticle.class.getName() };
 searchContext.setEntryClassNames(entryClassNames);

 hits = FacetedSearcher.getInstance().search(searchContext);
 List<Document> docs = hits.toList();

那么如何在facet搜索中包含我的结构特定属性,如“section”等...

我的另一个问题是标点符号存在问题。假设标题包含“Právo”字样。当我用“pravo”这个词进行搜索时,它会带来0个结果但是当我用“právo”运行搜索时,它会找到我的结果。是否有使用标点符号进行搜索的解决方法?

谢谢, 帕特里克

1 个答案:

答案 0 :(得分:2)

在6.2中搜索FT索引相当混乱,我设法这样做(groovy):

Indexer indexer = IndexerRegistryUtil.getIndexer(JournalArticle.class.name);

SearchContext sc = new SearchContext([
        companyId: PortalUtil.defaultCompanyId,
        groupIds: groupId
]);

String testText = DDMIndexerUtil.encodeName(
        structureId, "custom-field-name", LocaleUtil.fromLanguageId("pl_PL"));

BooleanClause testTextClause = BooleanClauseFactoryUtil.create(
        sc, testText, "Search term", BooleanClauseOccur.MUST.getName())

sc.setBooleanClauses(testTextClause)

sc.setStart(QueryUtil.ALL_POS);
sc.setEnd(QueryUtil.ALL_POS);

sc.setAttribute("paginationType", "none");

hits = indexer.search(sc);

hits.toList().each { Document doc ->
    JournalArticle ja = JournalArticleLocalServiceUtil.getArticle(groupId, doc.get("articleId"))
    println "${ja.getTitle(LocaleUtil.fromLanguageId("pl_PL"))}"
}

要运行此功能,您需要structureId(检查journalarticle表)和groupId