簡體   English   中英

搜索代碼優化-CakePHP

[英]Search code optimisation - CakePHP

我有一個包含文件列表(大約6000個文件)的數據庫。 所有這些文件都具有鏈接到它們的某些其他詳細信息(例如,項目編號,部門,客戶,注釋,學科)。

盡管代碼和搜索有效,但速度非常慢。 一個包含兩個詞的簡單搜索大約需要一分鍾才能完成。

我的代碼如下。 我想知道的是,如何簡化和優化搜索功能?

public function search() {
    $Terms = explode(' ',$this->request->data['KmFiles']['search']);
    $possible = 0;
    $Matches = array();
    foreach($Terms as $Term) {
        $Files = $this->KmFile->find('list',
            array(
                'conditions' => array(
                    'file_name LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('id')
            )
        );
        $possible++;
        $Clients = $this->KmClient->find('list',
            array(
                'conditions' => array(
                    'clients LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('km_file_id')
            )
        );
        $possible++;
        $Disciplines = $this->KmDiscipline->find('list',
            array(
                'conditions' => array(
                    'disciplines LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('km_file_id')
            )
        );
        $possible++;
        $Projects = $this->KmProject->find('list',
            array(
                'conditions' => array(
                    'projects LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('km_file_id')
            )
        );
        $possible++;
        $Sectors = $this->KmSector->find('list',
            array(
                'conditions' => array(
                    'sectors LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('km_file_id')
            )
        );
        $possible++;
        $Comments = $this->KmComment->find('list',
            array(
                'conditions' => array(
                    'comments LIKE' => '%' . $Term . '%'
                ),
                'fields' => array('km_file_id')
            )
        );
        $possible++;
        $Matches = array_merge($Matches,$Files,$Clients,$Disciplines,$Projects,$Sectors,$Comments);
    }
    if(count($Matches) > 0) {
        $NumberOfMatches = array_count_values($Matches);
        $Matches = array_unique($Matches);
        $k=0;
        foreach($Matches as $Match) {
            $Result = $this->KmFile->find('all',
                array(
                    'conditions' => array(
                        'id' => $Match
                    )
                )
            );
        $Results[$k] = $Result[0];
        $Results[$k]['Relevance'] = round(($NumberOfMatches[$Match] / $possible) * 100,2);
        $relevance[] = $Results[$k]['Relevance'];
        $k++;
    }
        array_multisort($relevance,SORT_DESC,$Results);
        $Stats['Count'] = count($Results);
        $Stats['Terms'] = $this->request->data['KmFiles']['search'];
        $this->set(compact('Results','Stats'));
    } else {
        $Stats['Count'] = 0;
        $Stats['Terms'] = $this->request->data['KmFiles']['search'];
        $this->set(compact('Stats'));
    }
}

我知道這是一段很長的代碼,但是對於CakePHP來說我還很陌生,所以不知道該怎么做來改進它。

任何幫助將不勝感激。

為了使其更快,您必須盡可能多地承擔數據庫責任(如今,數據庫的確非常快!),並最小化PHP與數據庫之間的往返。 理想情況下,您將在單個查詢(即單個find調用)中獲取所有搜索結果。

您可以指定joins ,這樣您的KmFile模型就可以左連接到KmClient,KmProject等表。

然后,只需要建立一個長條件數組即可。 在Cake中,您可以指定“ OR”條件,如下所示:

array('OR' => array(
    array('Post.title LIKE' => '%one%'),
    array('Post.title LIKE' => '%two%')
))

復雜的查找條件下檢查doco。 您的條件數組如下所示:

array('OR' => array(
    array('KmFile.file_name LIKE' => '%term1%'),
    array('KmFile.file_name LIKE' => '%term2%'),
    array('KmDiscipline.disciplines LIKE' => '%term1%'),
    array('KmDiscipline.disciplines LIKE' => '%term2%'),
    array('KmProject.projects LIKE' => '%term1%'),
    array('KmProject.projects LIKE' => '%term2%'),
    // and so on...
))

顯然,您希望使用循環來構建條件數組。

然后在您的KmFile模型上進行一個單一查找,並與所有相關模型一起加入條件列表。 這將返回一個匹配列表,並且不要花太長時間。

盡管我不知道如何在同一個查詢中計算某種相關性分數。 而且,無論如何,一旦您在單個查詢中找到了查找結果,在PHP代碼中遍歷它們並為每個結果計算相關性就不會花太長時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM