灵活的MySQL搜索查询

时间:2013-08-21 04:47:58

标签: mysql

假设我有一张美国城市及其相应州的表格:

City          State_Abbr     State
Charlotte     NC             North Carolina
Fort Mill     SC             South Carolina
Columbia      SC             South Carolina
Dallas        TX             Texas
...           ...            ...

当然桌子要大得多,但你明白了。现在,我希望用户能够通过HTML页面上的单个输入对此表执行搜索。寻找北卡罗来纳州夏洛特的用户可以输入以下任何一项:

charlotte north carolina
charlotte, nc
north carolina charlotte
nc charlotte
charlotte
...

或者他们可能会拼错一个单词cherlote而不是charlotte ...

设置搜索查询的最佳方法是什么?我应该删除搜索字符串中的所有字符并按空格分割,然后对表中的每个字段执行SOUNDS LIKE吗?在像夏洛特北卡罗莱纳这样的输入的情况下,我如何确定夏洛特是城市部分和北卡罗莱纳州?

是否可以在纯SQL查询中完成所有这些操作,还是需要在构建实际查询之前通过Java或Javascript等方式执行一些预处理?

只是寻找最灵活的方法。使用过多的OR似乎会返回非常随机的结果。

我不想将此问题仅限于java,但如果我需要预处理Java是我最舒服的语言。

3 个答案:

答案 0 :(得分:0)

我会在空格处拆分,然后在所有可能的列上使用LIKE。然后,如果有一个记录点击率最高,我会选择那个。可以使用ORDER BY为您执行计数,因此您不必在PHP中执行此操作,并且可以返回最佳记录。

答案 1 :(得分:0)

首先必须拆分输入值:

输入1: SPLIT (charlotte north carolina) => [charlotte, north carolina]

输入2: SPLIT (charlotte nc) => [nc, charlotte]

第二个必须连接所有可能的列,以将它们视为相同的元素:

SELECT CONCAT (City, State_Abbr, State) as all_columns

...

第三个必须以这种方式生成动态查询,具体取决于第一步产生的值:

输入1:

SELECT DISTINCT CONCAT (City, State_Abbr, State) as all_columns
FROM Table_Cities_Name
WHERE upper (all_columns) LIKE upper ('%charlotte%')
OR upper (all_columns) LIKE upper ('%north%')
OR upper (all_columns) LIKE upper ('%carolina%')

输入2:

SELECT DISTINCT  CONCAT (City, State_Abbr, State) as all_columns
FROM Table_Cities_Name
WHERE upper (all_columns) LIKE upper ('%nc%')
OR upper (all_columns) LIKE upper ('%charlotte%')

注意:示例不区分大小写。如果您希望示例区分大小写,请在查询中删除上层函数

  

编辑在查询中添加了DISTINCT子句。

此致

答案 2 :(得分:0)

尝试全文索引。你必须阅读手册,看​​它是否适合你的情况,但通常它有助于模糊的东西。

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html