0

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

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 是我最舒服的语言。

4

3 回答 3

0

我会在空格处拆分,然后在所有可能的列上使用 LIKE 。然后,如果有一张唱片的点击率最高,我会选择那个唱片。可以使用 ORDER BY 来为您计算,这样您就不必在 PHP 中进行,并且可以返回最佳记录。

于 2013-08-21T05:14:38.190 回答
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 子句。

问候

于 2013-08-21T06:36:25.173 回答
0

尝试全文索引。您必须阅读手册以查看它是否适合您的情况,但通常它有助于解决模糊的问题。

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

于 2013-08-22T12:36:49.230 回答