我想实现自定义搜索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”运行搜索时,它会找到我的结果。是否有使用标点符号进行搜索的解决方法?
谢谢, 帕特里克
答案 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
。