1

検索結果で製品の SKU を優先させたいというクライアントからのリクエストがあります。SKU は、定義されたキー CF_TITLE にあります。私は真実性があまり得意ではなく、ドキュメンテーションはそこにありません。CF_TITLE のみを検索するように変更することはできましたが、残りの結果に影響を与えました。また、現在の基準が正しいかどうかもわかりません。これは、私が見つけた構文例に実際に従っていないためです。

では、残りの結果に影響を与えることなく、結果で「CF_TITLE」の完全一致を優先できるように、基準を変更するにはどうすればよいでしょうか?

これは現在の検索タグです。

<cfsearch
collection="company"
name="SearchResults"
criteria="(<NOT> CF_KEY <MATCHES> #SearchKeywords#) 
AND (#SearchKeywords#)" 
status="Info">
4

2 に答える 2

0

Verity は主に基準の発生回数に基づいて関連性を判断するため、結果を「優先順位付けする」方法の 1 つは、コレクションのインデックス作成時に 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 から始めて、必要な結果が得られるまで上方に調整することもできます。

于 2011-05-03T08:34:13.603 に答える
0

SKU の形式は予測可能ですか? その場合は、SKU が検出された場合に verity に渡される基準の形式を変更できます。たとえば、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 はタイトル フィールドのみを検索します。それ以外の場合は、インデックス全体に対して通常の検索を行います。どれだけ厳密に一致させる必要があるかに応じて、上記を変更する必要があるかもしれませんが、アイデアは得られます。

于 2011-05-08T18:49:32.450 に答える