全文搜索排名

时间:2011-09-16 00:04:40

标签: mysql full-text-search

我在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;

BOOLEAN 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;

我喜欢在自然语言模式下搜索时获得的索引但是如何阻止某人输入“bag bag bag bag bag”作为产品名称以获得良好的搜索结果?

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

关于如何充分利用两个世界的任何想法?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-3)

非常简单,使用Lucene,它更先进,肯定有选项来处理你想要的东西。