Как добавить значения строк и получить уникальные строки после их добавления

Я использую Coldfusion для поиска по сайту моей компании. У меня есть хранимая процедура, вызываемая внутри cfc, которая возвращает все результаты по ключевому слову, без ограничений.

Затем я делаю подзапрос, который либо ограничивает данные, к которым у меня есть доступ, на основе настроек безопасности, либо ограничивает их на основе моей фильтрации результата до 1 из 5 подмножеств данных.

Теперь мы ищем в базе данных, используя представление, и это представление представляет собой объединение всех запросов, что позволяет мне искать несколько таблиц одновременно, а результат возвращает столбцы «id, type, title, url, rank». С разными значениями ранга для того, как он нашел эти конкретные результаты, что приводит к дублированию результатов с разными значениями ранга....

Теперь мой босс хочет, чтобы я суммировал все значения рангов, обновил 1 запись и удалил остальные дубликаты...

Так, например, если я искал слово бизнес

И у меня были разные результаты, например, найдено в заголовке +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>

Должен быть лучший способ с точки зрения производительности суммировать значения рангов, избавиться от повторяющихся строк без зацикливания.

Любые мысли или предложения?


person crosenblum    schedule 21.02.2011    source источник
comment
Вы думали об использовании Solr для этого? Он связан с CF9. Мы думаем использовать его для передачи данных базы данных в набор документов, которые мы можем искать. Я думаю, что затем вы можете ранжировать результаты и т. д. Больше информации в Интернете и вот пример CF: coldfusionjedi.com/index.cfm/2009/8/20/   -  person Ciaran Archer    schedule 21.02.2011
comment
Извините, у нас стандарт cf8, и нет, мы не можем обновиться.   -  person crosenblum    schedule 21.02.2011
comment
Можете ли вы показать образец набора записей, возвращенный хранимой процедурой?   -  person Antony    schedule 22.02.2011
comment
Честно говоря, это то, что нужно делать на вашем сервере базы данных, а не в коде CF. Если вам нужен только определенный набор совпадений, то это то, что вы должны вернуть в свое приложение. Я бы порекомендовал создать новый SP для выполнения этой работы за вас на уровне БД и просто вернуть то, что вам нужно, в CF.   -  person Dan Short    schedule 22.02.2011


Ответы (1)


Я понял, что ответ заключается в том, чтобы сделать сумму вокруг поля ранга, и это сделало это быстро.

person crosenblum    schedule 02.03.2011