MySQL查询 - 基于权重的搜索引擎

时间:2011-08-18 23:09:07

标签: mysql optimization search-engine

以下是医疗MIS表的数据库结构:

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. 位置
  3. 关键字会根据得分进行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. 描述权重最小
    4. 请帮助获取SQL查询以考虑所有这些权重并有效搜索。

1 个答案:

答案 0 :(得分:1)

考虑转向Sphinx以获得满意的解决方案。

有500万行,以及您的要求,MySQL全文搜索的性能将令人失望。

相关问题