2011-08-18 56 views
0

這是一種醫療MIS表的數據庫結構:MySQL查詢 - 重量爲基礎的搜索引擎

CREATE TABLE IF NOT EXISTS `ab_med` (
    `med_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `med_title` varchar(200) DEFAULT NULL, 
    `med_posted_date` varchar(200) DEFAULT NULL, 
    `med_company_name` varchar(200) DEFAULT NULL, 
    `med_experience` varchar(200) DEFAULT NULL, 
    `med_salary` varchar(200) DEFAULT NULL, 
    `med_city` varchar(200) DEFAULT NULL, 
    `med_description_short` text, 
    `med_details_link` varchar(500) DEFAULT NULL, 
    `med_from_city_type` int(1) NOT NULL DEFAULT '1', 
    `med_from_city` varchar(255) DEFAULT NULL, 
    `med_collected_time` datetime DEFAULT NULL, 
    `med_status` int(1) NOT NULL, 
    PRIMARY KEY (`med_id`), 
    KEY `MedCity` (`med_city`), 
    KEY `MedTitle` (`med_title`), 
    KEY `MedCompany` (`med_company_name`), 
    KEY `MedExperience` (`med_experience`), 
    KEY `med_details_link` (`med_details_link`), 
    FULLTEXT KEY `med_index` (`med_title`,`med_company_name`,`med_description_short`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=639295 ; 

大約有50萬條記錄。用戶可以搜索使用2個字段:

  1. 關鍵字
  2. 位置

關鍵字被看着med_titlemed_company_namemed_description_shortmed_city按照得分。

位置是看着med_city

我使用全文搜索的MySQL,但我需要最新的條目用更好的成績出現。我沒有得到它的SQL查詢。我使用下面的SQL查詢:

SELECT distinct(med_details_link),med_id,med_title,med_posted_date,med_company_name,med_description_short,med_from_city,med_experience,med_city,med_collected_time,MATCH (med_title,med_company_name,med_description_short) AGAINST ('+hello +world' IN BOOLEAN MODE) as score 
FROM ab_med 
WHERE MATCH (med_title,med_company_name,med_description_short) AGAINST ('+hello +world' IN BOOLEAN MODE) order by med_id desc limit 1000 

想我搜索「世界你好」,我的理解,應該根據是重量:

  1. 冠軍將有最高的權重
  2. 公司名字會比標題比說明重量更輕但更
  3. 說明將有至少重量

請幫助獲取SQL查詢以考慮所有這些權重並進行有效搜索。

回答

1

考慮轉向獅身人面像以獲得令人滿意的解決方案。

隨着500萬行和您的要求,MySQL全文搜索的性能將令人失望。

+0

即使有50萬條記錄,您是否也會提出相同的建議?數據庫將沿着這條線延伸。此外,關於使用獅身人面像的具體情況的具體信息? – dang

+0

看到這個問題:http://stackoverflow.com/questions/5036666/guide-to-using-sphinx-with-php-and-mysql –