用于搜索多列的MySQL索引

时间:2012-02-03 21:55:57

标签: c# asp.net mysql full-text-search

我很想知道人们的想法,我们有一个非常小的开发团队,而且现场没有真正的(核心)数据库专业知识。

我们正在确定一个需要“智能搜索”的新项目,这意味着他们指定了模糊搜索,例如:

个人记录(由于交易要求而在innodb内持有)

  
      
  • 名字(varchar)
  •   
  • 姓氏(varchar)
  •   
  • EmailAddress(varchar)
  •   
  • Lastlogin(日期时间 - 每次登录时更新)
  •   
  • LastOrder(日期时间 - 接受订单时更新)
  •   

他们希望能够搜索任何或多个字段,包括日期列的范围和varchars的部分完成,例如:

  
      
  • 名字+ lastOrder
  •   
  • “史蒂夫”将返回所有与史蒂夫和史蒂文一起乞讨的名字(如?)
  •   
  • 姓氏+ EmailAddress + LastLogin
  •   
  • 2011-01-01和2012-01-01之间的Lastlogin
  •   
  • Lastorder< 2012-01-01
  •   

我理解这些例子中的一些是相当具体的,“应该”总是只返回一行,但它是要求的一个例子而不是确切的结构。

我们正在决定如何最好地实施它,没有人能够同意(像往常一样!)我很想知道其他人如何实现这一功能以及为什么他们选择了这个解决方案。

  1. 为每一列编制索引 - 不是非常理想和大量使用内存
  2. 复合索引 - 无法预测要搜索的列的顺序或数量
  3. 在MyISAM中创建一个条目并使用FULLINDEX,例如“MyFirstName MyLastName me@mycompany.com” - 缺点无法比较日期范围
  4. 使用lucene.net或类似的索引服务(难以在我们面向IIS服务器的3个Web上实现,类似的问题很难实现#3)
  5. 持有数据变体的视图 - 缺点,需要索引以及更多内存/ CPU使用而没有任何实际好处
  6. 笨重的查询:

    SELECT
    (Firstname LIKE “Steve%”) as fn_matched_data
    (Lastlogin BETWEEN 2011-01-01 AND 2012-01-01) as ll_matched_data
    FROM TABLE
    WHERE Firstname LIKE “Steve%” OR Lastlogin BETWEEN 2011-01-01 AND 2012-01-01
    
  7. 我知道存在相互矛盾的规范 - 想要同时搜索所有内容,同时应用范围等。我真的想告诉业务我们不是谷歌并降低他们对搜索要求的期望。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

听起来你应该考虑像SOLR

这样的专业外部搜索解决方案