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

 Поиск и индексация – стандартные задачи.
 Для решения таких задач в 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 getToolByName
from DateTime import DateTime
portal_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(p
   ath = { 'query': ['f11'],'level' : 2 })
for i in results:
  print i.getId
return printed
Результат:
f11
f11
f123
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 object
return printed

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

  • 1.
    Поиск и индексация Поиск и индексация – стандартные задачи.  Для решения таких задач в Zope включен специальный объект – ZCatalog.
  • 2.
    ZCatalog ZCatalog позволяет проводить каталогизацию и поиск:  по любым видам объектов Zope  по внешним данным: 1. реляционные данные 2. Файлы 3. веб-страницы на других сайтах
  • 3.
    Действие ZCatalog Объекты сайта Индексы Определяют условия отбора 1 2 3 4 Метаданные набор значений, которые будут отображаться в результирующем отчете
  • 4.
    ZCatalog  Объекты типаZCatalog – специальные контейнеры  Хранят информацию о каталогизированных объектах в виде объектов –заменителей  Наборы объектов-заменителей формируютсяв индексы
  • 5.
    Индексы  Индексы -специализированные базы данных  Хранят информацию о объектах  Способны сохранять и очень быстро извлекать большие объемы данных.  Можете создавать индексы разного вида для сохранения различной информации о ваших объектах.
  • 6.
    таблица метаданных ZCatalog для отображения результатов поиска имеет специальную собственную таблицу, подобную обычной таблице реляционной базы данных – таблицу метаданных.  Для каждого каталогизируемого типа объектов можно определить набор значений, которые будут отображаться в результирующем отчете.
  • 7.
    таблица метаданных Для каждого значения отводится отдельный столбец таблицы. Изначально в этой таблице не установлен набор свойств для отображения, в результате мы получаем отчет в виде списка идентификаторов объекта. Свойства можно добавлять в набор и удалять из набора в форме управления каталогом
  • 8.
    таблица метаданных  Все объекты запроса имеют эти свойства
  • 9.
    Поиск и индексация Во время поиска каталог не просматривает объекты по одному.  Прежде каталог просматривает все объекты и запоминает информацию об этих объектах.  Этот процесс называется индексацией.
  • 10.
    ZCTextIndex  ZCTextIndex –разбивает текст на отдельные слова, используя правила разбиения, определенные в дополнительном объекте ZCTextIndex Lexicon.  Затем слова сортируются по частоте появления в тексте.
  • 11.
    Field Indexes  FieldIndexes – предназначен для построения индексов по отдельным атрибутам объекта или по их комбинациям.  Так например можно строить индекс по значению атрибута 'meta_type' или 'title'.
  • 12.
    DateIndex  DateIndex –предназначен для индексации атрибутов, имеющих тип DateTime.  DateRangeIndex– позволяет индексировать атрибуты объекто, имеющие тип DateTime, по диапазону значений.  Позволяет указывать нижнюю и верхнюю границы диапазона значений индексируемой величины.
  • 13.
    Keyword Indexes  KeywordIndexes позволяет строить индексы по атрибутам, принимающим значения из предопределенного списка значений ('keywords').  Индекс будет обрабатывать все объекты, содердащие одно или несколько значений из предопределенного набора
  • 14.
    PathIndex  PathIndex индексируетвсе объекты каталога по значению физического пути к объекту или по его части.  Это позволяет включать в индекс все объекты, путь к которым определен в виде: /<component1>/<component2>/..../<object_id> . Этот тип индекса позволяет производить индексацию объектов только в некоторой части сайта.
  • 15.
    TopicIndex  TopicIndex –индекс, представляющий собой промежуточный фильтр, отбирающий объекты по предопределенному условию с целью их дальнейшей индексации по определенному индексному типу.  Используется в случаях, когда критерий индексации слишком большой или громоздкий для прямой индексации. Позволяет проводить двухступенчатую индексацию объектов.
  • 16.
  • 17.
     В Ploneимеются встроенные каталоги  portal_catalog – индексирует все объекты по различным индексам  reference_catalog – индексирует ссылки одних объектов на другие  uid_catalog – сопоставляет уникальные идентификаторы объектам
  • 18.
    Программный доступ ккаталогу  from Products.CMFCore.utils import getToolByName  getToolByName - служба доступа к встроенным сервисам Plone  Наличие обязательно
  • 19.
    Программный доступ ккаталогу  #получение ссылки на объект портала  urltool = getToolByName(context, "portal_url")  # получение объекта портала portal = urltool.getPortalObject()  Наличие обязательно
  • 20.
    Получение каталогов  #получениеportal_catalog  catalogtool = getToolByName(context, "portal_catalog")  #получение reference_catalog  refCatalog = getToolByName(portal, 'reference_catalog')  #получение uid_catalog  uid_catalog=getToolByName(portal, 'uid_catalog')
  • 21.
  • 22.
     Множество индексовв portal_catalog позволяют эффективно организовать поиск
  • 27.
  • 28.
     searchResults  Методобъекта portal_catalog  Производит поиск на основе передаваемых параметров
  • 29.
    Тип ZCTextIndex  Индексы типа ZCTextIndex позволяют индексировать базу потекстовым критериям  SearchableText – индексирует текст всех полей классов, у которых установлен атрибут включения в поиск по тексту  Description - индексирует тексты из поля description
  • 30.
    SearchableText index  sort_on- индех, предоставляющий данные для сортировки, в предположении что их можно сортировать  sort_order - определяет направление и порядок сортировки  • sort_limit - определяет количество элементов в результате поска. Указание оптимизирует поиск
  • 31.
    Поиск первых пятиопубликованных объектов, отсортированных по дате публикации: context.portal_catalog.searchResults( review_state = "published", sort_order = "reverse", sort_limit = 5, sort_on="Date” )
  • 32.
     Если параметрыпоиска не указаны, возвращаются все элементы из указанного индекса или всего каталога
  • 33.
    FieldIndex  Тип FieldIndexиндексирует по свойствам (полям) контент-типов  Для поиска по FieldIndex index передается значение поля: results = context.portal_catalog.searchResults( Type = "Image")  Поиск в FieldIndex, определенного для поля Type и значения Image
  • 34.
    Индекс по полюможет производить поиск по диапазону значений Диапазон определяется граничными значениями дат, чисел, строк и т.д. В индекс передается словарь query , содержащий граничные значения range – определяет способ отбора данных created = { "query": [start, end],"range": "minmax" }
  • 35.
    range  Значения параметраrange:  min: все значения больше указанного  max: все значения меньше указанного  minmax: все значения меньше минимума и больше максимума
  • 36.
    Поиск всех событийпосле указанной даты: from Products.CMFCore.utils import getToolByName from DateTime import DateTime portal_catalog = getToolByName(context, 'portal_catalog') now = DateTime() results = portal_catalog.searchResults( Type = "Event" end = { "query": [now,], "range": "min" } )
  • 37.
    Для поиска подиапазону , как например для всех событий в декабре, нужно вычислить начальное и конечное значение start = DateTime('2009/12/01') end = DateTime('2009/12/31') results = portal_catalog.searchResults( Type = "News Item", created = { "query": [start, end], "range": "minmax" } )
  • 38.
    KeywordIndex  Индекс KeywordIndexвозвращает все значения, помеченные соответствующими ключевыми словами.  Определяются параметром Subject  Ключевые слова назначаются через вкладку Properties в странице редактирования объекта.
  • 39.
    Поиск всех объектовс ключевым словом Africa : results = context.portal_catalog.searchResults( Subject = "Africa" )
  • 40.
     Как иFieldIndex, индекс KeywordIndex может получать более сложные запросы, используя операторы and/or (“or” по умолчанию).  Указывается в параметре operator: results = context.portal_catalog.searchResults( Subject = { "query": ["Africa", "sun"], "operator": "and" } )
  • 41.
    PathIndex  PathIndex позволяетпроизводить поиск объектов по указанию выражения пути.  Так запрос по пути Members вернет все личные папки : results = context.portal_catalog.searchResults( path = "/Plone/Members" ) Все личные папки сайта
  • 42.
     Ограничение поискапроизводится указанием параметра level  Level – число, указывающее позицию в выражении пути. Нумерация идет слева направо разделитель: ‘/’  "/Plone/Members"  Plone - уровень 0  Members - уровень 1
  • 43.
     Как ив KeywordIndex, можно использовать операторы and/or.  Получить все объекты из /f1/f11/f123 и /f2/f11/f234 results = context.portal_catalog.searchResults( path = { "query": ["danae"], "level" : 2 } )
  • 44.
    Python Scripts results=context.portal_catalog.searchResults(p ath = { 'query': ['f11'],'level' : 2 }) for i in results: print i.getId return printed
  • 45.
  • 46.
     Из поисковогозапроса необходимо получать метаданные и свойства реальных объектов  Получение обеспечивается методами объекта запроса
  • 47.
     getId –id: столбец в таблице метаданных  getPath - физический путь внутри Zope.  getURL - URL текущего объекта.  getObject - ссылка на объект.  getRID - уникальный ID объекта в каталоге, меняется при каждом запросе  getИмя_метаданных –общий шаблон
  • 48.
    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
  • 49.
    Получение ссылки наобъект results = context.portal_catalog.searchResults() for result in results: object = result.getObject() print object return printed