我正在使用Coldfusion,为我的公司进行网站搜索。我在cfc中调用了一个存储过程,它返回关键字的所有结果,没有限制。
然后我做一个子查询,根据安全设置限制我有权访问的数据,或者根据我将结果过滤到5个数据子集中的1个来限制它。
现在我们使用视图搜索数据库,该视图是一个union all查询,允许我一次搜索多个表,结果返回“id,type,title,url,rank”列。对于如何找到这个特定结果的不同等级值,最终得到具有不同等级值的重复结果....
现在我的老板,要我加上所有等级值,更新1条记录,并删除其余的重复...
例如,如果我正在寻找商业词汇
我有不同的结果,例如,在标题中找到,+ 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>
必须有一种更好的方法,性能明智,总结排名值,摆脱重复行而不循环。
有任何想法或建议吗?
答案 0 :(得分:0)
我想出答案是在排名领域做一笔总和,这让它变得快。