Приоритизация CF_TITLE в наборе результатов Verity - PullRequest
1 голос
/ 02 мая 2011

У меня есть запрос от клиента, который хочет иметь возможность расставить приоритеты своего 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 голосов
/ 08 мая 2011

У 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 будет искать только поле заголовка.В противном случае он будет выполнять обычный поиск по всему индексу.Возможно, вам придется изменить вышеперечисленное в зависимости от того, насколько строго все должно соответствовать, но вы поняли.

0 голосов
/ 03 мая 2011

Поскольку 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 и настраивать его вверх, пока не увидите желаемые результаты.

...