Я использую Coldfusion для поиска по сайту моей компании. У меня есть хранимая процедура, вызываемая внутри cfc, которая возвращает все результаты по ключевому слову, без ограничений.
Затем я делаю подзапрос, который либо ограничивает данные, к которым у меня есть доступ, на основе настроек безопасности, либо ограничивает их на основе моей фильтрации результата до 1 из 5 подмножеств данных.
Теперь мы ищем в базе данных, используя представление, и это представление представляет собой объединение всех запросов, что позволяет мне искать несколько таблиц одновременно, а результат возвращает столбцы «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>
Должен быть лучший способ с точки зрения производительности суммировать значения рангов, избавиться от повторяющихся строк без зацикливания.
Любые мысли или предложения?