Продолжается переработка поиска, начатая с миграции на Manticore.
До текущего обновления поисковая строка в ELiS работала только по нодам, а полнотекстовый поиск задействовался только для книг в PDF и для презентаций.
Однако становится очевидной необходимость находить из поисковой строки не только ресурсы, но и остальные сущности Drupal (термины, пользователи, файлы, комментарии и т.д.), а для этого надо перестроить поисковый индекс с поиска по нодам на поиск по сущностям.
В обновлении сделан шаг в этом направлении. Теперь в поисковом сервере Manticore сделан новый индекс "entity", все остальные индексы ("library", "node", "user", "term") больше не используются и могут быть удалены.
Содержание
- 1 Индекс entity
- 2 Добавление в индекс entity всех файлов
- 3 Поиск по фрагментам
- 4 Поиск по страницам ресурсов типа 'pdf' модуля ELiS PDF
- 5 Нахождение сущностей
- 6 Автодополнение с автокоррекцией
- 7 Упрощенный поиск сущностей
- 8 Текстовый сниппет
- 9 Вывод числа найденных ресурсов
- 10 Изображения найденных сущностей
- 11 Отчеты по поисковому индексу
- 12 Настройка весов полей
- 13 Обновление
Индекс entity[править]
Теперь поисковые результаты имеют поля:
- id - хеш от сущности;
- entity_type - тип сущности;
- entity_id - идентификатор сущности (nid для ноды, uid для пользователя, tid для термина, cid для комментария, fid для файла);
- bundle - подтип сущности (для ноды это "pdf", "presentation", "subj", ... для терминов "person", "tags", "classification",..
- text - полнотекстовое поле, куда записывается ассоциированный с сущностью текст.
Также добавляются поля field_*, но без приставки field_ (скажем для field_parent_catalog будет добавлено поле parent_catalog).
Могут быть и другие поля, но главное в текущем изменении то, что теперь есть один индекс для всех типов сущностей и значит в одном отсортированном списке результатов поиска могут находиться и книги и персоны и пользователи и различные теги.
В дальнейшнем пользователю не надо знать где искать персон, где классы из классификации, а где пользователей и просто в поиске можно ввести что ищешь.
Добавление в индекс entity всех файлов[править]
Теперь используется библиотека Apache Tika для извлечения текста и добавления его из всех полей с файлами к ноде ресурса. Т.е. если вы добавите поле "вложения" и к некоторому ресурсу в PDF во вложение поместите документ docx, то текст из docx добавится в поле сущности entity.text и таким образом ресурс можно найти и по текстовому содержимому прикрепленных к ресурсу файлов.
Если у ресурса в различных полях несколько файлов, текст из всех из них (который только может быть извлечен Apache Tika), будет добавлен в текстовое поле сущности.
Для любой сущности ELiS в поисковый индекс добавляются прикрепленные файлы, совместимые с Apache Tika].
При попадании поискового запроса в текст файла будет открываться не сам файл, а сущность к которой файл прикреплен (например нода).
Т.о. заработал полнотекстовый поиск и для EPUB, SWF, ZIP-архива и т.д., но выводит он пока не на конкретный фрагмент, а на сущность (ноду), кроме случаев, когда конкретный модуль ELiS реализует необходимый функционал.
Поиск по фрагментам[править]
Положим у нас есть книга в PDF из модуля ELiS PDF. На книгу создается одна Drupal-сущность и она сохраняется в базе вместе с прикрепленным файлом.
Но что делать, если в результате поиска надо открыть конкретную страницу с попаданием в поиск, а не просто перейти на страницу книги.
Раньше для этого модуль Ebooks генерировал на каждую страницу собственную ноду (сущность). Но это оказалось неудобным при работе на сайте и в результате от генерации сущностей на фрагменты решено отказаться, а как реализация подхода вышел модуль ELiS PDF.
Теперь принято решение пока фрагменты ресурсов в виде отдельных сущностей в Drupal не создавать, но создать их в поисковом индексе.
Такой подход позволяет переходить при поиске на фрагменты не утяжеляя базу Drupal лишними сущностями, смысл которых пользователям не очевиден.
Эта задача уже реализована и для одной сущности с полем entity_id теперь генерируется в поисковом сервере множество документов с таким-же полем entity_id, но с другим полем id и собственным полем фрагмента.
Т.о. на книгу с двумя страницами будет сгенерировано три документа в поисковом сервере:
Документ ресурса целиком
entity - id = '342516' - entity_id = '444' - entity_type = 'node' - bundle = 'pdf' - fragment = null - text = "текст со всей книги и всех вложенных файлов"
Документ первой страницы (фрагмента page-1)
entity - id = '654321' - entity_id = '444' - entity_type = 'node' - bundle = 'pdf' - fragment = 'page-1' - text = "текст на странице 1"
Документ второй страницы (фрагмента page-2)
entity - id = '123456' - entity_id = '444' - entity_type = 'node' - bundle = 'pdf' - fragment = 'page-2' - text = "текст на странице 2"
Обратите внимание, что в приведенном примере entity.id у всех разные, а entity.entity_id одинаковые, но разные entity.fragment.
Такой подход позволяет в будущем добавлять поддержку фрагментов с текстом для самых различных типов ресурсов и файлов и переходить из поиска на конкретный фрагмент.
Поиск по страницам ресурсов типа 'pdf' модуля ELiS PDF[править]
Теперь переход на фрагменты из поиска реализован (раньше этого функционала не существовало).
Нахождение сущностей[править]
Сущности из словарей, пользователи - теперь тоже находятся в однострочном поиске.
Но найти их смогут только пользователи с соответствующими правами нахождения терминов и пользователей.
Новые права доступа добавлены в настройках модуля, вам надо включить соответствующие права на странице admin/people/permissions.
Автодополнение с автокоррекцией[править]
Теперь при вводе появляются предложения слов для дополнения запроса (дополняется последнее слово).
Среди предложенных вариантов есть до двух слов с коррекцией букв в последнем слове на случай, если оно введено неправильно.
Упрощенный поиск сущностей[править]
Есть возможность переключить поиск на определенные типы сущностей. Для этого используйте
- user или пользователь нахождение пользователя (эквивалентно @entity_type user), пример: user Иванов;
- file или файл нахождение файла (эквивалентно @entity_type file), пример: file filename.pdf;
- person или персона нахождение термина в таксономии в словаре person(эквивалентно @bundle person), пример: person Пушкин;
- organization или организация нахождение термина в таксономии в словаре organization(эквивалентно @bundle organization), пример: организация университет;
- term или термин нахождение термина в любом словаре (эквивалентно @entity_type taxonomy_term), пример: термин Москва;
- resource или document или документ или игра нахождение любого ресурса (эквивалентно @entity_type node), пример: документ протокол испытаний;
- tag или keyword или тэг или тег или ключевое слово нахождение термина из словарей tags или classification (эквивалентно @bundle classification tags), пример: keyword издание.
Текстовый сниппет[править]
Теперь попадания в текст в результатах берутся из поискового сервера.
Вывод числа найденных ресурсов[править]
Теперь над результатами поиска выводится общее число найденных ресурсов.
Изображения найденных сущностей[править]
Изображения берутся из первого изображения в field_cover или field_image при их наличии.
Для пользователей (сущность user) изображением является аватар, который можно включить в настройках сайта admin/config/people/accounts.
Отчеты по поисковому индексу[править]
На странице reports/elis/statistics добавлены показатели:
- всего ресурсов в поисковом индексе
- размер индекса
Обратите внимание, что число ресурсов в поисковом индексе обычно больше числа нод (числа документов) в ELiS.
Настройка весов полей[править]
Теперь можно каждому поисковому полю придавать вес отличный от веса по умолчанию.
Попадание термов поискового запроса в поле с большим весом приведет к более высокому ранжированию документа.
Подробности здесь: http://elibsystem.ru/docs/admin/elis_search.html#field-weights
Обновление[править]
Общее обновление будет подготовлено в ближайшее время и для него надо будет выполнить описанные ниже шаги.
обновитесь стандартным способом.
Дополнительно:
- dnf update
- dnf update drupal7-* --skip-broken
- dnf update elis-* --skip-broken
Если у вас последняя версия ELiS 2.1 или ниже, выполните обновление по инструкциям:
Надо полностью перестроить индекс, что длительная операция:
# systemctl stop manticore # rm -Rf /var/lib/manticore/*.* # rm -Rf /var/lib/manticore/binlog/* # cd /var/www/vh/library # su elis $ drush elis-search-reconfigure $ exit # systemctl start manticore # su elis $ drush elis-search-reindex