Как я могу использовать Verity для индексации и поиска содержимого базы данных в ColdFusion 9?
Я пытался использовать ColdFusion 9 для создания поисковой системы на моем сайте. Ключ Verity, который я прочитал, это лучший инструмент для индексации и поиска по содержимому моей базы данных.
Но я безуспешно ищу какой-нибудь учебник, чтобы сказать мне, как это сделать, даже учебник отсутствует, или я думаю, что не нашел его.
Я использую ColdFusion 9 с сервером MySQL. Не могли бы вы посоветовать мне, как это сделать? или любой учебник, статья или электронная книга также приветствуются.
1 ответ
На самом деле, у вас есть два отличных движка для CF9: Verity (классический) и Solr (современный).
Оба они реализуют идею коллекций. Создание и обслуживание коллекции довольно очевидно и может быть найдено в руководстве (см. Предыдущие ссылки).
Главный совет для вас можно найти на странице руководства по тегу cfindex: вы можете заполнить (обновить) коллекцию данными запроса. Установите тип пользовательский, введите имя запроса и все необходимые столбцы (комбинации могут отличаться).
Все, что вам нужно после этого, это использовать cfsearch.
Также я могу рекомендовать настроить скрипт, выполняемый планировщиком, чтобы периодически обновлять вашу коллекцию.
РЕДАКТИРОВАТЬ
Пример кода (примечание: код не проверен, просто упрощенный вырез из моего старого компонента). Это два метода CFC.
<cffunction name="index" access="public" returntype="any" output="true" hint="Rebuild search index">
<cfargument name="collection" type="string" required="true" hint="Target collection name">
<cfset var local = {} />
<cftry>
<!--- pull the content --->
<cfquery datasource="#variables.dsn#" name="local.getContent">
SELECT C.id, C.title, C.content, P.name AS page
FROM #variables.tableContent# C
INNER JOIN #variables.tablePages# P
ON C.id_page = P.id
</cfquery>
<!--- update collection --->
<cflock name="cfindex_lock" type="exclusive" timeout="30">
<cfindex collection="#arguments.collection#"
action="refresh"
type="custom"
query="local.getContent"
key="id"
custom1="page"
title="title"
body="title,content"
>
</cflock>
<cfreturn true />
<cfcatch type="any">
<!--- custom error handler here --->
<cfreturn false />
</cfcatch>
</cftry>
</cffunction>
<cffunction name="search" access="public" returntype="any" output="true" hint="Perform search through the collection">
<cfargument name="collection" type="string" required="true" hint="Target collection name">
<cfargument name="type" type="string" required="true" hint="Search type">
<cfargument name="criteria" type="string" required="true" hint="Search criteria">
<cfargument name="startrow" type="numeric" required="false" default="1" hint="Select offset">
<cfargument name="maxrows" type="numeric" required="false" default="50" hint="Select items count">
<cfset var local = {} />
<cftry>
<!--- pull the data from collection --->
<cfsearch collection="#arguments.collection#"
name="local.searchResults"
type="#arguments.type#"
criteria="#LCase(arguments.criteria)#"
startrow="#arguments.startrow#"
maxrows="#arguments.maxrows#"
>
<cfset local.resultsArray = [] />
<!--- convert data into the array --->
<cfloop query="local.searchResults">
<cfscript>
local.res = StructNew();
local.res["id"] = local.searchResults.key;
local.res["summary"] = Left(local.searchResults.summary, 500) & "...";
// highlight the search phrase
local.res["summary"] = ReplaceNoCase(local.res["summary"], arguments.criteria, "<strong>" & arguments.criteria & "</strong>", "ALL");
local.res["page"] = local.searchResults.custom1;
local.res["title"] = local.searchResults.title;
ArrayAppend(local.resultsArray, local.res);
</cfscript>
</cfloop>
<cfreturn local.resultsArray />
<cfcatch type="any">
<!--- custom error handler here --->
<cfreturn false />
</cfcatch>
</cftry>
</cffunction>