Следуя приведенному выше обсуждению, я вставляю немного нашего кода для вдохновения.
У нас было аналогичное требование: разрешить поиск в областях интересов пользователя/областях знаний, которые представляют собой пользовательскую структуру данных (например, теги), то есть не индексируются по умолчанию.
Во-первых, я определил новые text
поля в Solr-х scheme.xml
- их имена хранятся в постоянных AREAS_OF_EXPERTISE
и AREAS_OF_INTEREST
.
Тогда мы написали наш обычай IndexerPostProcessor
и перекрываться в postProcessDocument
и postProcessSearchQuery
методы:
import com.liferay.portal.kernel.search.BaseIndexerPostProcessor;
// other imports
public class CustomUserIndexerPostProcessor extends BaseIndexerPostProcessor implements CustomeIndexerConstants {
private static Log log = LogFactoryUtil.getLog(CustomUserIndexerPostProcessor.class);
@Override
public void postProcessSearchQuery(BooleanQuery searchQuery, SearchContext searchContext) throws Exception {
searchQuery.addTerm(AREAS_OF_EXPERTISE, searchContext.getKeywords());
searchQuery.addTerm(AREAS_OF_INTEREST, searchContext.getKeywords());
}
@Override
public void postProcessDocument(Document document, Object obj) throws Exception {
addAreasOfExpertise(document);
addAreasOfInterest(document);
}
private void addAreasOfExpertise(Document document) throws NestableException {
long userID = GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK));
AssetEntry expertiseEntry = AssetEntryLocalServiceUtil.fetchEntry(User.class.getName() + "#areasOfExpertise", userID);
String[] expertiseTags = new String[] {};
if (expertiseEntry != null) {
expertiseTags = expertiseEntry.getTagNames();
}
log.debug("Adding areas of expertise to user [" + document.get("fullName") + "]: " + StringUtil.merge(expertiseTags));
document.addText(AREAS_OF_EXPERTISE, StringUtil.merge(expertiseTags, ", "));
}
private void addAreasOfInterest(Document document) throws NestableException {
long userID = GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK));
AssetEntry interestsEntry = AssetEntryLocalServiceUtil.fetchEntry(User.class.getName() + "#areasOfInterest", userID);
String[] interestsTags = new String[] {};
if (interestsEntry != null) {
interestsTags = interestsEntry.getTagNames();
}
log.debug("Adding areas of interest to user [" + document.get("fullName") + "]: " + StringUtil.merge(interestsTags));
document.addText(AREAS_OF_INTEREST, StringUtil.merge(interestsTags, ", "));
}
}
И последний шаг, чтобы добавить этот класс custopm постпроцессора в свой liferay-hook.xml
:
<indexer-post-processor>
<indexer-class-name>com.liferay.portal.model.User</indexer-class-name>
<indexer-post-processor-impl>our.company.projectname.search.CustomUserIndexerPostProcessor</indexer-post-processor-impl>
</indexer-post-processor>
И вы готовы к развертыванию. Конечно, вы должны повторно проиндексировать весь контент портала после развертывания этого изменения (как описано в шаге 5 учебника).
Поэтому я хочу добавить поиск номера телефона в портлете поиска. я узнал, что номер телефона не является индексом в searchindex. Я не знаю, так много о Liferay, но я уверен, что мне нужно индексировать номера телефонов, почти сравнимые с типом задания. Но я не могу найти, как это сделать. – Steven
Как получить телефоны пользователя: http://www.liferay.com/community/forums/-/message_boards/message/105992 –
Ty за то, что помог мне до сих пор. Это номер телефона по идентификатору пользователя. Я хочу поместить номер телефона в поисковую панель и вернуть список пользователей с этим номером телефона. Это вопрос, которого я не видел. – Steven