我正在尝试构建一个查询来搜索mysql中的全文索引

时间:2010-05-31 17:28:16

标签: mysql search full-text-search

表的架构非常简单。我有一个子表,存储客户的信息,如地址和电话号码。列是user_id,fieldname,fieldvalue和fieldname。因此每行将包含一个项目,如电话号码,地址或电子邮件。这是为每个客户提供无限数量的每种类型的信息。

手机上的人需要在呼叫我们的呼叫中心时快速查找这些客户。我已经尝试使用LIKE%,现在我正在使用FULLTEXT索引。我的查询有效,但我想让它们更有用,因为如果有人搜索805这样的电话区号会带来很多人,那么他们会添加名称Bill来缩小它,'805 Bill'。它会向每个客户显示805 OR Bill。我希望它能够在每个客户的多行中进行AND搜索。

目前我正在使用下面的查询来获取user_ids,稍后我会进行另一个查询来获取每个用户的所有详细信息以构建他们的完整记录。

SELECT DISTINCT `user_id` FROM `user_details` WHERE MATCH (`fieldvalue`) AGAINST ('805 Bill')

同样,我想针对属于单个用户的行组进行上述查询,但这些用户必须匹配搜索关键字。我该怎么办?

2 个答案:

答案 0 :(得分:0)

想法:你能有两个FULLTEXT索引并且做WHERE MATCH(等等)和MATCH(等等)吗?

当然,您可以将区号存储在单独的字段中。

MySQL还支持子选择,因此您不必进行两次查询即可获得结果。

答案 1 :(得分:0)

您是否尝试过使用BOOLEAN MODE次搜索查询?

SELECT `user_id` FROM `user_details` 
WHERE MATCH (`fieldvalue`) AGAINST ('+805 +Bill' IN BOOLEAN MODE)

这意味着您必须操纵用户输入的搜索查询。你不能只是逐字地将它传递给你的查询;你必须添加+个字符等等。


重新评论:任何SQL谓词一次仅在一行的上下文中进行评估。比较行的方法是使用自联接:

SELECT `user_id` FROM `user_details` u1 JOIN `user_details` u2 USING (`user_id`)
WHERE MATCH (u1.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE)
  AND MATCH (u2.`fieldvalue`) AGAINST ('805 Bill' IN BOOLEAN MODE)

PS:我删除了DISTINCT因为它在此查询中是无操作,只能降低性能。