假设我有一张美国城市及其相应州的表格:
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是我最舒服的语言。
答案 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)
尝试全文索引。你必须阅读手册,看它是否适合你的情况,但通常它有助于模糊的东西。