为了给不同的列不同的权重,当然可以使用:
select ...
from table_name
where match(column1,column2...columnn) against('+test..')
order by weight1*(match (column1) against('test..'))
+ weight2*(match (column2) against('+test..'))
+ ...
+ weightn*(match (column1) against('test..'))
但是当结果量很大时,上述 order by 的成本可能会非常高!
有没有更有效的方法来做到这一点?
使用思维狮身人面像,http://freelancing-god.github.com/ts/en/
这是一个老问题,但由于这里没有答案,所以我会尝试一下。
在我看来,最有效的方法是不重复索引。由于MySQL引擎会重用重复的查询,因此如果每个索引只单独查询一次,则可以节省一点。例如,在原来的问题中,您有一个索引,其中包含要查询的所有字段,然后单独查询每个字段。如果您取消单个索引并在两个位置查询每个单独的索引,那么效率会更高一些。像这样的东西:
select ...
from table_name
where match (column1) against('test..')
OR match (column2) against('+test..')
OR match (columnN) against('test..')
order by weight1*(match (column1) against('test..'))
+ weight2*(match (column2) against('+test..'))
+ ...
+ weightN*(match (columnN) against('test..'))
通过按顺序和位置重用查询,您将不会运行不必要的查询。它仍然不是单个文本搜索中真正的加权搜索,但至少好一点。