home

Значительное обновление поиска

search-entity-update.jpg

Продолжается переработка поиска, начатая с миграции на Manticore.

До текущего обновления поисковая строка в ELiS работала только по нодам, а полнотекстовый поиск задействовался только для книг в PDF и для презентаций.

Однако становится очевидной необходимость находить из поисковой строки не только ресурсы, но и остальные сущности Drupal (термины, пользователи, файлы, комментарии и т.д.), а для этого надо перестроить поисковый индекс с поиска по нодам на поиск по сущностям.

В обновлении сделан шаг в этом направлении. Теперь в поисковом сервере Manticore сделан новый индекс "entity", все остальные индексы ("library", "node", "user", "term") больше не используются и могут быть удалены.

Индекс 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.

entity-search-image.jpg

Автодополнение с автокоррекцией[править]

Теперь при вводе появляются предложения слов для дополнения запроса (дополняется последнее слово).

Среди предложенных вариантов есть до двух слов с коррекцией букв в последнем слове на случай, если оно введено неправильно.

search-autocomplete.jpg

Упрощенный поиск сущностей[править]

Есть возможность переключить поиск на определенные типы сущностей. Для этого используйте

  • 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 издание.

Текстовый сниппет[править]

Теперь попадания в текст в результатах берутся из поискового сервера.

Вывод числа найденных ресурсов[править]

Теперь над результатами поиска выводится общее число найденных ресурсов.

search-total.jpg

Изображения найденных сущностей[править]

Изображения берутся из первого изображения в field_cover или field_image при их наличии.

Для пользователей (сущность user) изображением является аватар, который можно включить в настройках сайта admin/config/people/accounts.

Отчеты по поисковому индексу[править]

На странице reports/elis/statistics добавлены показатели:

  • всего ресурсов в поисковом индексе
  • размер индекса

Обратите внимание, что число ресурсов в поисковом индексе обычно больше числа нод (числа документов) в ELiS.

search-index-stats.jpg

Настройка весов полей[править]

Теперь можно каждому поисковому полю придавать вес отличный от веса по умолчанию.

Попадание термов поискового запроса в поле с большим весом приведет к более высокому ранжированию документа.

Подробности здесь: http://elibsystem.ru/docs/admin/elis_search.html#field-weights

default-search-config.jpg

Обновление[править]

Общее обновление будет подготовлено в ближайшее время и для него надо будет выполнить описанные ниже шаги.

обновитесь стандартным способом.

Дополнительно:

  • 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