Приоритизация CF_TITLE в наборе результатов Verity
У меня есть запрос от клиента, который хочет иметь возможность расставить приоритеты своего SKU продукта в результатах поиска. SKU находится в определенном ключе CF_TITLE. Я не очень хорош с правдой, и документация там не очень хорошая. Мне удалось изменить его, чтобы найти только CF_TITLE, но это повлияло на остальные результаты. Я также не уверен, что текущие критерии также верны, поскольку они не соответствуют ни одному из примеров синтаксиса, который я нашел.
Итак, как я могу изменить критерии, чтобы мы могли расставить приоритеты для точного соответствия "CF_TITLE" в результатах, не влияя на остальные результаты?
Это их текущий поисковый тег:
<cfsearch
collection="company"
name="SearchResults"
criteria="(<NOT> CF_KEY <MATCHES> #SearchKeywords#)
AND (#SearchKeywords#)"
status="Info">
2 ответа
У SKU есть предсказуемый формат? Если это так, то, возможно, вы могли бы изменить форму критериев, которые передаются в истину, если обнаружен SKU. Например, если все ваши SKU начинаются с 3 букв, за которыми следуют 3 цифры:
<cfscript>
// forced example; replace this with actual keywords from the search form
searchKeyWords = "ABC123";
// RegEx to detect SKUs according to their format
if( REFind( "^\w{3,3}\d{3,3}$",searchKeyWords ) )
request.criteria = "CF_TITLE <CONTAINS> #searchKeyWords#";
else
request.criteria = searchKeyWords;
</cfscript>
<cfsearch
collection="company"
name="SearchResults"
criteria="#request.criteria#">
Таким образом, если SKU был обнаружен, Verity будет искать только поле заголовка. В противном случае он будет выполнять обычный поиск по всему индексу. Возможно, вам придется изменить вышеприведенное в зависимости от того, насколько строго все должно соответствовать, но вы поняли идею.
Поскольку Verity определяет релевантность в значительной степени на основе количества появлений критериев, одним из способов "расстановки приоритетов" результатов будет искусственное добавление SKU несколько раз к "телу" при индексации коллекции.
Вы можете сделать это либо в исходном запросе SQL, либо использовать ColdFusion для массажа набора результатов, чтобы дополнить его SKU, прежде чем передать его в Verity. Вот пример последнего варианта:
<!--- Get the product data--->
<cfquery name="qProducts" datasource="blog">
SELECT
ID
,SKU
,title
,description
FROM
products
</cfquery>
<!--- Massage the data to prioritise the SKU by creating a new query from the original --->
<cfset qProductsForIndex = QueryNew( "ID,title,body","Integer,VarChar,VarChar" )>
<cfloop query="qProducts">
<cfset QueryAddRow( qProductsForIndex )>
<cfset QuerySetCell( qProductsForIndex,"ID",qProducts.ID )>
<cfset QuerySetCell( qProductsForIndex,"title",qProducts.title )>
<!--- Add the SKU 5 times, separated by a semi-colon --->
<cfset QuerySetCell( qProductsForIndex,"body",qProducts.description & ";" & RepeatString( qProducts.SKU & ";",5 ) )>
</cfloop>
<!--- Pass the massaged query to Verity --->
<cfindex action="REFRESH"
collection="products"
type="CUSTOM"
query="qProductsForIndex"
key="ID"
title="title"
body="body">
Обратите внимание на точку с запятой, разделяющую дополнительные SKU, это гарантирует, что Verity будет сопоставлять их как отдельные вхождения.
В качестве примера я использовал 5, но вы можете начать с 2 и настраивать его вверх, пока не увидите желаемые результаты.