在Verity结果集中优先考虑CF_TITLE

时间:2011-05-02 09:10:10

标签: search coldfusion criteria 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 个答案:

答案 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,则仅搜索标题字段。否则它会对整个索引进行正常搜索。你可能需要根据需要匹配的严格程度来改变上述内容,但是你明白了。