2011-09-16 85 views
7

我有一个小问题(这就是我希望)与排名的全文搜索,我的搜索结果中的MySQL数据库。有两种方式我都试过写它:全文搜索排名

自然的方式:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,keywords) AGAINST('$cl_search') AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

布尔WAY:

SELECT SQL_CALC_FOUND_ROWS *, 
((MATCH(productname) AGAINST('$cl_search' IN BOOLEAN MODE))+ 
(MATCH(keywords) AGAINST('\"$cl_search\"' IN BOOLEAN MODE))) AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

我喜欢索引我得到的,当我在自然语言模式中进行搜索,但我该怎么办防止进入即“包包包包包包”有人为产品名称,以获得良好的搜索结果?

所以我写了布尔方式来解决这个问题,但是1.它比较慢,而且我没有得到像'比较字数'这样的其他相关性索引。

关于如何获得两全其美的想法?

回答

-3

很简单,使用Lucene代替它,它更先进,并且可以选择处理你想要的东西。

1

如何编写一个用户定义的函数,这将删除重复的关键字? 那么你的查询将如何:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') AS score 
FROM products 
    WHERE MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') 
    ORDER BY score DESC,lastupdated DESC;