我正在使用 Coldfusion 为我的公司进行网站搜索。我在 cfc 中调用了一个存储过程,它返回关键字的所有结果,没有限制。
然后我做一个子查询,要么根据安全设置限制我可以访问的数据,要么根据我将结果过滤到 5 个数据子集中的 1 个来限制它。
现在我们使用视图搜索数据库,该视图是一个联合所有查询,允许我一次搜索多个表,结果返回“id、type、title、url、rank”列。对于如何找到此特定结果的排名值不同,最终会产生具有不同排名值的重复结果....
现在我的老板,要我将所有排名值相加,更新 1 条记录,并删除其余的重复项......
例如,如果我正在搜索 hte word business
我有不同的结果,例如,在标题中找到 +500,与标题完全匹配 +1000,在描述中找到 +200
但问题是,当我尝试遍历所有结果时,它增加了显着的性能消耗。
所以我正在寻找一种替代方法来总结排名值,然后摆脱结果。
下面是我整个流程的基本逻辑流程
执行存储过程,它在视图中搜索关键字,以不同方式在不同字段中搜索,生成具有不同排名值的重复结果。
消除那些我无权访问的搜索结果,如果我选择将结果过滤到某个结果子集中,比如在书籍、杂货、植物中,则组成您喜欢的任何类别 :)
在这里,我将向您展示代码:
<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>
必须有一种更好的方法,在性能方面,对排名值求和,在不循环的情况下摆脱重复行。
有什么想法或建议吗?