【问题标题】:Database - the best way, how to search names数据库 - 最好的方法,如何搜索名称
【发布时间】:2011-10-13 04:39:21
【问题描述】:

这几天我正在解决以下情况: 在我的数据库表中,我有姓名和姓氏列。

在我的页面上,我输入了用于搜索人员的输入,但我正在努力解决一个问题,即如何在存储在两列中的数据库中搜索名称,并且我将名称作为字符串 ("Joe Green")。

例如,在数据库中我有以下内容:

Joe New
Joe Blue
Joe Green
Joe Francois Green

什么可能是最好的方法,如何解决这个问题?我目前正在使用 MySQL 数据库和 Rails 3。

编辑:谢谢大家的回复,但我不知道,如何用 Rails 3 表示法进行查询,是否可以使用“concat”?

【问题讨论】:

  • 所以“Joe”在一列中,而“New”/“Blue”/“Francois Green”在另一列中

标签: mysql database search


【解决方案1】:

如果您的数据库表引擎是 myISAM 则使用 FULLTEXT search

首先创建FULLTEXT索引

CREATE FULLTEXT INDEX fx_name ON pages (name, surname)

然后使用下面的查询来检索所需的数据

SELECT  *
FROM    table
WHERE   MATCH(name,surname) AGAINST ('keyword' IN BOOLEAN MODE)

更新

替代方案:使用CONCAT

首先创建索引

CREATE INDEX users_firstandlast ON users(name, surname);

选项 1: 在您的 WHERE 子句中重复 CONCAT(因为 AS 不会创建您可以在 WHERE 子句中使用的名称):

SELECT CONCAT(name, ' ', surname) as fullname 
FROM users 
WHERE CONCAT(name, ' ', surname) LIKE '%joe green%';

选项 2:

SELECT CONCAT(name, ' ', surname) as fullname 
FROM users 
WHERE name LIKE '%joegreen%' or surname LIKE '%joegreen%';

More information

【讨论】:

  • 我试着按照你的想法去做,我得到了这个查询 - SELECT persons.* FROM persons WHERE (concat(name, surname) like '%Joe Green%') 。这个查询的结果是什么 - 我没有得到名字
  • 为什么将where 条件包含在( 中??
  • Rails 自动生成 - Person.find(:all, :conditions => ["concat(name, surname) like ?", "%#{params[:search][:名称]}%"])
【解决方案2】:

一种方法是:
* 将用户的输入拆分为单词
* 搜索姓名和姓氏列中的每个单词

【讨论】:

    【解决方案3】:

    先用split函数来分割字符串

    namearr = name.split

    namestr = ""
    namearr.each do |i|
      namestr = namestr + i
    end
    

    然后使用查询中的值

    stmt = "select * from mytable where CONCAT(firstname,surename)= " + namestr

    【讨论】:

    • 如果我提供三个字呢?
    【解决方案4】:

    你可以使用我不推荐的sql server全文搜索,因为性能很差,或者使用更强大的lucin .net,她有一些链接: http://incubator.apache.org/lucene.net/

    http://msdn.microsoft.com/en-us/library/ms142571.aspx

    如果有帮助,标记为已回答:)

    【讨论】:

    • 当然我会将问题标记为已回答,但我仍然无法理解,如何在 Rails 3 中做...
    【解决方案5】:

    如果您在输入和数据库之间的接口处给出了一些使用语言的指示(因为 Rails 通常与 Ruby 相关联,我假设您的意思是),那么其中的大部分内容会变得更加简单,但是....

    SELECT *
    FROM yourtable
    WHERE CONCAT(name, ' ', surname) 
          LIKE CONCAT('%',REPLACE(?,' ', '%'),'%')
    ORDER BY LEVENSTEIN(CONCAT(name, ' ', surname), ?)
    

    (其中 '?' 替换为您的搜索字符串,以及 levenstein function is described here

    性能会很差 - 更好的解决方案是拆分字符串 Ruby 并尝试不同组合的匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 2010-11-13
      • 2016-08-25
      • 1970-01-01
      • 2011-04-12
      • 2012-05-23
      • 1970-01-01
      • 2021-07-27
      相关资源
      最近更新 更多