我收到客户的请求,希望能够在搜索结果中优先考虑他们的产品SKU。 SKU位于已定义的密钥CF_TITLE中。我对真实性并不是很好,文档也不是很好。我设法修改它只找到CF_TITLE,但它影响了其余的结果。我也不确定当前的标准是否正确,因为它并没有真正遵循我发现的任何示例语法。
那么我该如何修改标准,以便我们可以优先考虑结果中“CF_TITLE”的完全匹配而不影响其余的结果?
这是他们当前的搜索标记:
<cfsearch
collection="company"
name="SearchResults"
criteria="(<NOT> CF_KEY <MATCHES> #SearchKeywords#)
AND (#SearchKeywords#)"
status="Info">
答案 0 :(得分:0)
由于Verity主要根据标准的出现次数确定相关性,因此“优先排序”结果的一种方法是在索引集合时人为地将SKU多次附加到“正文”。
您可以在原始SQL查询中执行此操作,也可以使用ColdFusion按摩结果集以在将其传递给Verity之前使用SKU填充它。以下是后一个选项的示例:
<!--- 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开始并向上调整,直到看到您想要的结果。
答案 1 :(得分:0)
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,则仅搜索标题字段。否则它会对整个索引进行正常搜索。你可能需要根据需要匹配的严格程度来改变上述内容,但是你明白了。