0

我正在使用 Coldfusion 为我的公司进行网站搜索。我在 cfc 中调用了一个存储过程,它返回关键字的所有结果,没有限制。

然后我做一个子查询,要么根据安全设置限制我可以访问的数据,要么根据我将结果过滤到 5 个数据子集中的 1 个来限制它。

现在我们使用视图搜索数据库,该视图是一个联合所有查询,允许我一次搜索多个表,结果返回“id、type、title、url、rank”列。对于如何找到此特定结果的排名值不同,最终会产生具有不同排名值的重复结果....

现在我的老板,要我将所有排名值相加,更新 1 条记录,并删除其余的重复项......

例如,如果我正在搜索 hte word business

我有不同的结果,例如,在标题中找到 +500,与标题完全匹配 +1000,在描述中找到 +200

但问题是,当我尝试遍历所有结果时,它增加了显着的性能消耗。

所以我正在寻找一种替代方法来总结排名值,然后摆脱结果。

下面是我整个流程的基本逻辑流程

  1. 执行存储过程,它在视图中搜索关键字,以不同方式在不同字段中搜索,生成具有不同排名值的重复结果。

  2. 消除那些我无权访问的搜索结果,如果我选择将结果过滤到某个结果子集中,比如在书籍、杂货、植物中,则组成您喜欢的任何类别 :)

在这里,我将向您展示代码:

  <cfloop query="get_matches">
        <!--- check if this already exists --->
        <cfquery name="check_match" dbtype="query">
            select id, sum(rank) as total
            from get_matches
            where url = '#get_matches.url#'
            group by id
        </cfquery>

        <cfif check_match.total gt 1>

            <!--- add the two rank values --->
            <cfset my_rank = val(check_match.total) />

            <!--- update the search results --->
            <cfset get_matches.rank[get_matches.currentrow] = javacast("int",my_rank) />

            <!--- get a list of rows that has that url --->

            <!--- eliminate all other rows --->
            <cfquery name="get_matches_bot" dbtype="query">
                select id, type, title, url, rank
                from get_matches
                where url <> '#get_matches.url#'
                group by id, type, title, url, rank
            </cfquery>

            <cfquery name="get_matches_top" dbtype="query">
                select id, type, title, url, rank
                from get_matches
                where url = '#get_matches.url#'
                and rank = #my_rank#
                group by id, type, title, url, rank
            </cfquery>

            <cfquery name="get_matches" dbtype="query">
                select id, type, title, url, rank
                from get_matches_top
                union
                select id, type, title, url, rank
                from get_matches_bot
                group by id, type, title, url, rank
                order by rank desc, title asc
            </cfquery>


        </cfif>

    </cfloop>

然后,在完成所有这些后,帮助双方获得具有排名值总数的唯一行,这些行在 #2 结果中有记录。

    <cfquery name="get_matches" dbtype="query">
        select id, type, title, url, rank
        from get_matches
        group by id, type, title, url, rank
        order by rank desc, title asc
    </cfquery>

必须有一种更好的方法,在性能方面,对排名值求和,在不循环的情况下摆脱重复行。

有什么想法或建议吗?

4

1 回答 1

0

我想出答案是在排名字段周围做一个总和,这让它很快。

于 2011-03-02T15:17:47.267 回答