Я использую Coldfusion, чтобы выполнить поиск по сайту для моей компании. У меня есть хранимая процедура, вызываемая в cfc, которая возвращает все результаты для ключевого слова, без ограничений.
Затем я выполняю подзапрос, который либо ограничивает те данные, к которым у меня есть доступ, на основе настроек безопасности, либо ограничивает их на основе того, что я фильтрую результат до 1 из 5 подмножеств данных.
Теперь мы ищем базу данных, используя представление, и это представление представляет собой запрос на объединение всех, что позволяет мне выполнять поиск по нескольким таблицам одновременно, и результат возвращает столбцы «id, type, title, url, rank». С различными значениями ранга для того, как он нашел эти конкретные результаты, что в итоге приводит к дублированию результатов с разными значениями ранга ....
Теперь мой босс хочет, чтобы я сложил все значения рангов, обновил 1 запись и удалил остальные дубликаты ...
Так, например, если я искал слово "бизнес"
И у меня были разные результаты, такие как: найдено в заголовке, +500, точное совпадение для заголовка +1000, найдено в описании + 200
Но проблема в том, что когда я пытался выполнить цикл по всем результатам, это привело к значительному снижению производительности.
Поэтому я ищу альтернативный способ суммировать значения рангов, а затем избавиться от результатов.
Ниже приведен мой основной логический поток для всего процесса
Do Stored Процедура, которая выполняет поиск по ключевому слову, выполняет поиск в разных полях по-разному, генерируя дублированные результаты с различными значениями ранга.
Исключает результаты поиска из тех, к которым у меня нет доступа, и если я выбрал фильтрацию результатов в определенном подмножестве результатов, например, в книгах, продуктовых магазинах, растениях, составляйте любые категории, которые вам нравятся :)
Здесь я покажу вам код:
<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>
Должен быть лучший способ, с точки зрения производительности, суммировать значения рангов, избавляться от дублирующихся строк без зацикливания.
Есть мысли или предложения?