【问题标题】:MySQL string searching technique?MySQL字符串搜索技术?
【发布时间】:2013-09-13 15:19:16
【问题描述】:

在我的 android 应用程序中,我有一个搜索字段,用户可以在其中输入内容。他们可以在我的数据库中输入他们想要的任何内容,例如姓名、地址、电话号码、电子邮件等。

我希望它像谷歌搜索中的多合一搜索栏,以便他们可以键入名称和地址等内容的组合。

问题是我将如何进行搜索,其中搜索文本可以包含多个短语?

例如,如果用户搜索“Jack Daniel jdaniel@hotmail.com”,那么我希望 mysql select 语句最终是这样的:

select id from members
where firstname=`Jack` or firstname=`Daniel` or firstname=`jdaniel@hotmail.com`
   or lastname=`Jack` or lastname=`Daniel` or lastname=`jdaniel@hotmail.com`
   or email=`Jack` or email=`Daniel` or email=`jdaniel@hotmail.com`

基本上搜索文本的每个短语都需要与所有列进行比较。

MySQL 是否有内置机制可以轻松做到这一点,还是我必须在 java 中解析字符串并手动构建 sql 语句?

谢谢

【问题讨论】:

  • 您可能需要在转到 SQL 之前进行解析,例如对于电子邮件,如果可以在搜索短语的任何位置输入或不输入,则需要在本地解析它。除了用户可以执行的格式之外,您无法区分什么是名称或地址,因此您可能需要在其他字段中进行搜索。

标签: java mysql database search


【解决方案1】:

用户喜欢“快速搜索”,出于可用性考虑,我认为这对匹配字符串中的任何位置最有效——因此是 LIKE '%Jack%' 条件。

我不会为了“快速搜索”而将字段和子句分开。 (对于一个完整的搜索表单,我为用户可以搜索的每个字段提供了单独的输入。)但是快速搜索是一个简单的 UI。

我不区分大小写。如果它不是您的数据库的默认值,您可以在匹配之前对字符串使用 lower() 函数。

对于输入“千斤顶”:

select * from members 
where fullname like '%Jacks%' or email like '%Jacks%'

或者,就像我在 FireBird 中强制不区分大小写一样:

select * from members 
where lower(fullname) like '%jacks%' or lower(email) like '%jacks%'

这将匹配所有:

fullname='Mike Jackson'
fullname='Jackson Five'
fullname='Lumberjacks R Us'
email='phil@jackstrucking.com'

如果需要,您可以将名字和姓氏字段分开。我的设计更喜欢将它们放在一起,因为我主要只是将全名用于显示目的,而不关心区别。

【讨论】:

  • 所以当你说LIKE时,意思是is a substring of?
  • % 是 LIKE 中的多字符通配符,相当于文件名中的 *(_ 相当于 ?)。 LIKE 'a%' 匹配以“a”开头的字符串,LIKE '%a' 匹配以“a”结尾的字符串,LIKE '%a%' 匹配字符串中任何位置的“a”。
  • 只是想知道是否区分大小写——既然 SQLite 是 Android 平台自带的,你为什么要问 MySQL?
  • 我正在使用一个使用 php 和 mysql 的免费网络服务器。这个条件也是真的:jack LIKE %jack daniels%? (jack daniels 是搜索文本,jack 是列值)
  • 不,“%jack daniels%”太具体且太长,无法仅匹配“jack”。如果您的用户想要 Jack Daniels,他们可能会首先搜索“daniels”或“jack”——他们通常会首先搜索一个简短的独特词或短语。如果他们专门寻找“丹尼尔斯”,他们不想只看到杰克。
【解决方案2】:

我认为通配符会对您有所帮助。 在这里查看: http://www.w3schools.com/sql/sql_wildcards.asp

我的建议是尝试添加一个名为 FULLNAME 的列,然后可以使用如下内容:

select id from members where
fullname='%Jack%' or fullname="%Daniel%" or email="%jack%" or email="%daniel%"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2016-09-22
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多