2014-01-20 43 views
0

我正在做这个项目的作业。这个想法是建立一个类似于Netflix的网站。如何区分用户搜索输入的关键字?

我的任务是:

On the "Searching" page, the customer can search for movies by any of the following attributes or their combination (logical "AND" operation): 
title; 
year; 
director; 
star's first name and/or last name. This means you need to do both: a) first name or last name if only one of the two names is provided; b) first name and last name, if both names are provided. 

我需要查询我的MySQL数据库对所有的电影,演员等配套的查询和吐回了我的网站上。我想知道区分用户搜索输入的关键字的最佳方式。我最初的想法是用空格分隔用户的搜索关键字,然后尝试将它们与MySQL表中的每一列进行匹配。

例如,如果用户搜索“冰冻伊迪娜门泽尔”我会先分析自己的搜索为单个单词“冻结”,“伊迪娜”,“门泽尔”,我会这样说

SELECT * FROM movies WHERE title = 'Frozen' UNION 
SELECT * FROM stars WHERE first_name = 'Frozen' UNION 
SELECT * FROM stars WHERE last_name = 'Frozen' UNION 
SELECT * FROM movies WHERE title = 'Idina' UNION 
SELECT * FROM stars WHERE first_name = 'Idina' UNION 
SELECT * FROM stars WHERE last_name = 'Idina' UNION 
SELECT * FROM movies WHERE title = 'Menzel' UNION 
SELECT * FROM stars WHERE first_name = 'Menzel' UNION 
SELECT * FROM stars WHERE last_name = 'Menzel' 
SELECT * FROM stars WHERE first_name = 'Frozen' AND last_name = 'Idina'; 
SELECT * FROM stars WHERE first_name = 'Idina' AND last_name = 'Menzel'; 

但是,这似乎不是一个很好的方法,因为有很多不必要的查询,所以我想知道是否有更好的方法来做到这一点。

+1

你有没有听说过全文检索? http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html –

回答

1

你如何处理这个取决于你有多少时间留给自己完成该项目。 ElasticSearch对于download极其简单,并且无论平台如何都能运行起来。

ElasticSearch是基于Apache Lucene的Inverted Index搜索工具。如果您先阅读正确的材料,您可以非常快速地实施ElasticSearch解决方案。数据在索引时进行分析,您可以应用分词器和过滤器来定义索引的外观。我有一部名为“The Shawshank Redemption”的电影,你已经定义了一个标准的标记器,这将创建一个索引,其中包含下列术语和小写字母 - “shawshank”和“redemption”,请注意,“The”消失了,因为这个是一个停止词。

ElasticSearch使用了很好的DSL查询语言,并提供了大量文档。即使你不把它用于这个项目,也要为其他人考虑。

注 - Netflix在您键入时也会提示。 ElasticSearch可以做到这一点。