2011-08-18 58 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 –