Liferay Поиск по структурированному веб-контенту, соответствующему термину вложения

У нас есть структура веб-контента «S» с полем «Документ и медиа».

Мы создали веб-контент с именем «W» на основе предыдущей структуры «S» с вложенным файлом слова «a» с текстом «hello» внутри него.

Мы знаем, что lucene/ElasticSearch индексирует содержимое вложения, если это, например, файл word или pdf.

Итак, мы выполняем поиск в lucene (используя booleanQuery, подбирая номер журнала), чтобы получить веб-контент S, соответствующий поисковому запросу «привет».

Но мы увидели, что lucene, фильтруя journalArticle, возвращает json-подобный объект с этими данными:

"ddm__keyword__87940__attachements_en_US":[ {\"groupId\":\"115863\",\"название\":\"a.word\",\"тип\":\"документ\",\"uuid\": \"dffd1d3d-8b78-a64c-4d0c-8d004d24cb75\"}]

У него есть только ссылка на объект DLFileEntry.

Есть ли способ с помощью всего одного запроса получить журнальную статью, соответствующую вложению слова?

Мы видели, что Liferay предлагает «индексирующий постпроцессор», который может помочь нам хранить данные DLFileEntry внутри нового поля нашего веб-контента, но индексация DLFileEntry является асинхронной.

Что мы можем сделать ?


person Clemaul    schedule 31.01.2019    source источник
comment
Не могли бы вы подробно объяснить, какой API вы используете и как выглядит ваш запрос? Потому что обычно вы получаете больше, чем просто вложения. Важно понимать, что из Search-API вы получаете только то, что там хранилось при индексации. И из вашего предпоследнего предложения я бы предположил, что вы ищете способ получить содержимое вложения слова вместе с содержанием журнальной статьи?   -  person Tobias Liefke    schedule 04.02.2019
comment
Версия Liferay: 7.1.1 GA2 Мы используем IndexSearcherHelperUtil.search(searchContext, searchQuery); из com.liferay.portal.kernel.search.IndexSearcherHelperUtil Мы добавляем нашу структуру и ограничение journalArticle к объекту searchContext, см. ниже: searchQuery.addRequiredTerm(Field.ENTRY_CLASS_NAME, JournalArticle.class.getName()); searchQuery.addRequiredTerm(Field.CLASS_TYPE_ID, structureId);   -  person Clemaul    schedule 04.02.2019
comment
Что касается нашего вопроса, то, что мы хотим, это не извлекать вложение и журнальную статью за один раз, а иметь возможность извлекать все журнальные статьи, соответствующие нашему поисковому запросу в структуре или в содержимом вложения.   -  person Clemaul    schedule 04.02.2019


Ответы (2)


Если вы не настаиваете на одном запросе на уровне ES, я бы обратился к нему с помощью постпроцессоров Hit.

https://dev.liferay.com/de/develop/tutorials/-/knowledge_base/7-0/introduction-to-liferay-search#hitsprocessor

Я бы запросил слово в файлах, а затем, если есть совпадение, я бы улучшил результат с помощью постпроцессора, чтобы добавить/заменить потенциальную запись веб-контента.

person Miroslav Ligas    schedule 09.02.2019

Мы нашли решение:

  1. мы создаем постпроцессор индексатора ловушек для класса JournalArticle.
  2. в постпроцессоре индексатора мы извлекаем dlFileEntry и индексируем его с помощью document.addFile().
  3. в нашем портлете теперь мы можем запрашивать содержимое файла с помощью логического запроса (addterm) и с помощью IndexSearcherHelperUtil.search

Единственным недостатком является то, что содержимое файла индексируется дважды (изначально с помощью dlFileEntry, а теперь и в journalArticle).

person Clemaul    schedule 28.02.2019