【发布时间】:2021-02-11 03:30:17
【问题描述】:
我正在尝试使用 SearchContext、IndexSearcherHelperUtil 和所有其他东西为 Liferay 7.3.5 GA6 开发自定义 Web 内容搜索 Portlet。
我有一些带有不同字段的 DDMStructure,从我在 elasticsearch 索引上看到的内容来看,这些字段在嵌套文档中被索引,如下所示:
"ddmFieldArray": [
{
"ddmFieldName": "ddm__text__37702__nome_it_IT",
"ddmValueFieldName": "ddmFieldValueText_it_IT",
"ddmFieldValueText_it_IT": "Nome esempio",
"ddmFieldValueText_it_IT_String_sortable": "nome esempio"
}
,
{
"ddmFieldName": "ddm__text__37702__descrizione_breve_it_IT",
"ddmValueFieldName": "ddmFieldValueText_it_IT",
"ddmFieldValueText_it_IT": "Esempio di descrizione breve da indicizzare",
"ddmFieldValueText_it_IT_String_sortable": "esempio di descrizione breve da indicizzare"
}
]
这与我以前知道的旧方式不同,自定义字段的索引方式类似于 ddm__[keyword/text]__[structure_id]__[field_name]
现在,我知道这种不同的索引方式是由于改进以避免弹性问题(已超出总字段的限制)但是...执行搜索后,没有 ddmFieldArray在 com.liferay.portal.kernel.search.Document .getFields 中,所以我无法从弹性搜索索引中获取 ddmstructure 字段值。
代码如下:
long journalArticleClassId = ClassNameLocalServiceUtil.getClassNameId(JournalArticle.class.getName());
SearchContext searchContext = new SearchContext();
searchContext.setClassTypeIds(new long[] {journalArticleClassId});
searchContext.setCompanyId(companyId);
searchContext.setStart(QueryUtil.ALL_POS);
searchContext.setEnd(QueryUtil.ALL_POS);
BooleanQuery query = new BooleanQueryImpl();
MatchQuery approvedQuery = new MatchQuery(Field.STATUS, String.valueOf(WorkflowConstants.STATUS_APPROVED));
query.add(approvedQuery, BooleanClauseOccur.MUST.getName());
Hits resultHits = IndexSearcherHelperUtil.search(searchContext, query);
for (Document doc: resultHits.getDocs()) {
doc.getFields().forEach((k, v) -> _log.debug(k)); //No ddm structure field
}
这仍然是一种改进还是只是一种意外行为?
有什么方法可以解决或扩展这个问题?
谢谢
【问题讨论】:
标签: java elasticsearch liferay portlet liferay-7