Каталоги и поиск в plone

Preview:

DESCRIPTION

 

Citation preview

Поиск и индексация

Поиск и индексация – стандартные задачи.

Для решения таких задач в Zope включен специальный объект – ZCatalog.

ZCatalog

ZCatalog позволяет проводить каталогизацию и поиск:

по любым видам объектов Zope по внешним данным:1. реляционные данные2. Файлы3. веб-страницы на других сайтах

Объекты сайта

ИндексыОпределяют условия отбора

Действие ZCatalog

1 2 3 4

Метаданныенабор значений, которые будут отображаться в

результирующем отчете

ZCatalog

Объекты типа ZCatalog – специальные контейнеры

Хранят информацию о каталогизированных объектах в виде объектов –заменителей

Наборы объектов-заменителей формируютсяв индексы

Индексы

Индексы - специализированные базы данных

Хранят информацию о объектах Способны сохранять и очень

быстро извлекать большие объемы данных.

Можете создавать индексы разного вида для сохранения различной информации о ваших объектах.

таблица метаданных

ZCatalog для отображения результатов поиска имеет специальную собственную таблицу, подобную обычной таблице реляционной базы данных – таблицу метаданных. Для каждого каталогизируемого типа объектов можно определить набор значений, которые будут отображаться в результирующем отчете.

таблица метаданных

Для каждого значения отводится отдельный столбец таблицы. Изначально в этой таблице не установлен набор свойств для отображения, в результате мы получаем отчет в виде списка идентификаторов объекта. Свойства можно добавлять в набор и удалять из набора в форме управления каталогом

таблица метаданных

Все объекты запроса имеют эти свойства

Поиск и индексация

Во время поиска каталог не просматривает объекты по одному.

Прежде каталог просматривает все объекты и запоминает информацию об этих объектах.

Этот процесс называется индексацией.

ZCTextIndex

ZCTextIndex – разбивает текст на отдельные слова, используя правила разбиения, определенные в дополнительном объекте ZCTextIndex Lexicon.

Затем слова сортируются по частоте появления в тексте.

Field Indexes

Field Indexes – предназначен для построения индексов по отдельным атрибутам объекта или по их комбинациям.

Так например можно строить индекс по значению атрибута 'meta_type' или 'title'.

DateIndex

DateIndex – предназначен для индексации атрибутов, имеющих тип DateTime.

DateRangeIndex– позволяет индексировать атрибуты объекто, имеющие тип DateTime, по диапазону значений.

Позволяет указывать нижнюю и верхнюю границы диапазона значений индексируемой величины.

Keyword Indexes

Keyword Indexes позволяет строить индексы по атрибутам, принимающим значения из предопределенного списка значений ('keywords').

Индекс будет обрабатывать все объекты, содердащие одно или несколько значений из предопределенного набора

PathIndex

PathIndex индексирует все объекты каталога по значению физического пути к объекту или по его части.

Это позволяет включать в индекс все объекты, путь к которым определен в виде: /<component1>/<component2>/..../<object_id> . Этот тип индекса позволяет производить индексацию объектов только в некоторой части сайта.

TopicIndex

TopicIndex – индекс, представляющий собой промежуточный фильтр, отбирающий объекты по предопределенному условию с целью их дальнейшей индексации по определенному индексному типу.

Используется в случаях, когда критерий индексации слишком большой или громоздкий для прямой индексации. Позволяет проводить двухступенчатую индексацию объектов.

ВСТРОЕННЫЕ КАТАЛОГИ PLONE

В Plone имеются встроенные каталоги

portal_catalog – индексирует все объекты по различным индексам

reference_catalog – индексирует ссылки одних объектов на другие

uid_catalog – сопоставляет уникальные идентификаторы объектам

Программный доступ к каталогу from Products.CMFCore.utils

import getToolByName

getToolByName - служба доступа к встроенным сервисам Plone

Наличие обязательно

Программный доступ к каталогу #получение ссылки на объект

портала urltool = getToolByName(context,

"portal_url") # получение объекта портала

portal = urltool.getPortalObject() Наличие обязательно

Получение каталогов

#получение portal_catalog catalogtool = getToolByName(context,

"portal_catalog") #получение reference_catalog refCatalog = getToolByName(portal,

'reference_catalog') #получение uid_catalog uid_catalog=getToolByName(portal,

'uid_catalog')

ИНДЕКСЫ PORTAL_CATALOG

Множество индексов в portal_catalog позволяют эффективно организовать поиск

ПОИСК

searchResults Метод объекта portal_catalog Производит поиск на основе

передаваемых параметров

Тип ZCTextIndex

Индексы типа ZCTextIndex позволяют индексировать базу потекстовым критериям

SearchableText – индексирует текст всех полей классов, у которых установлен атрибут включения в поиск по тексту

Description - индексирует тексты из поля description

SearchableText index

sort_on - индех, предоставляющий данные для сортировки, в предположении что их можно сортировать

sort_order - определяет направление и порядок сортировки

• sort_limit - определяет количество элементов в результате поска. Указание оптимизирует поиск

Поиск первых пяти опубликованных объектов, отсортированных по дате публикации:

context.portal_catalog.searchResults(review_state = "published",sort_order = "reverse",sort_limit = 5,sort_on="Date”)

Если параметры поиска не указаны, возвращаются все элементы из указанного индекса или всего каталога

FieldIndex

Тип FieldIndex индексирует по свойствам (полям) контент-типов

Для поиска по FieldIndex index передается значение поля:

results = context.portal_catalog.searchResults(

Type = "Image") Поиск в FieldIndex, определенного

для поля Type и значения Image

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

Диапазон определяется граничными значениями дат, чисел, строк и т.д.

В индекс передается словарь query , содержащий граничные

значения range – определяет способ отбора данныхcreated = { "query": [start, end],"range":

"minmax" }

range

Значения параметра range: min: все значения больше

указанного max: все значения меньше

указанного minmax: все значения меньше

минимума и больше максимума

Поиск всех событий после указанной даты:from Products.CMFCore.utils import getToolByNamefrom DateTime import DateTimeportal_catalog = getToolByName(context,

'portal_catalog')now = DateTime()results = portal_catalog.searchResults(Type = "Event"end = { "query": [now,],"range": "min" })

Для поиска по диапазону , как например для всех событий в декабре, нужно вычислить начальное и конечное значение

start = DateTime('2009/12/01')end = DateTime('2009/12/31')results = portal_catalog.searchResults(Type = "News Item",created = { "query": [start, end],"range": "minmax" })

KeywordIndex

Индекс KeywordIndex возвращает все значения, помеченные соответствующими ключевыми словами.

Определяются параметром Subject Ключевые слова назначаются

через вкладку Properties в странице редактирования объекта.

Поиск всех объектов с ключевым словом Africa :

results = context.portal_catalog.searchResults(

Subject = "Africa")

Как и FieldIndex, индекс KeywordIndex может получать более сложные запросы, используя операторы and/or (“or” по умолчанию).

Указывается в параметре operator:results =

context.portal_catalog.searchResults(Subject = { "query": ["Africa", "sun"],"operator": "and" })

PathIndex

PathIndex позволяет производить поиск объектов по указанию выражения пути.

Так запрос по пути Members вернет все личные папки :

results = context.portal_catalog.searchResults(

path = "/Plone/Members")Все личные папки сайта

Ограничение поиска производится указанием параметра level

Level – число, указывающее позицию в выражении пути. Нумерация идет слева направо разделитель: ‘/’

"/Plone/Members" Plone - уровень 0 Members - уровень 1

Как и в KeywordIndex, можно использовать операторы and/or.

Получить все объекты из /f1/f11/f123 и /f2/f11/f234

results = context.portal_catalog.searchResults(

path = { "query": ["danae"],"level" : 2 })

Python Scripts

results=context.portal_catalog.searchResults(path = { 'query': ['f11'],'level' : 2 })

for i in results: print i.getIdreturn printed

Результат:f11 f11f123 f234

Из поискового запроса необходимо получать метаданные и свойства реальных объектов

Получение обеспечивается методами объекта запроса

getId – id: столбец в таблице метаданных

getPath - физический путь внутри Zope.

getURL - URL текущего объекта. getObject - ссылка на объект. getRID - уникальный ID объекта

в каталоге, меняется при каждом запросе

getИмя_метаданных –общий шаблон

getPath()

results=context.portal_catalog.searchResults(path = { 'query': ['f11'],'level' : 2 })

for i in results: print i.getPath()return printedВывод:/Plone/f1/f11 /Plone/f2/f11 /Plone/f2/f11/f123 /Plone/f1/f11/f234

Получение ссылки на объектresults =

context.portal_catalog.searchResults()

for result in results: object = result.getObject() print objectreturn printed