Поиск и индексация Поиск и индексация – стандартные задачи. Для решения таких задач в Zope включен специальный объект – ZCatalog.
Поиск и индексация
Поиск и индексация – стандартные задачи.
Для решения таких задач в 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