通过大量可能的参数查询城市

时间:2013-05-09 19:31:19

标签: sql zend-framework search

在测试我的搜索引擎时,我意识到它不仅非常糟糕,而且对用户可以输入的很多组合都不起作用。

我有一个搜索字段,用户可以输入他想要的内容。 一个地区,一个城市名称,一个邮政编码,甚至一个国家或任何没有预定顺序或甚至是预定分隔符的组合。

由于用户可以在该字段中输入大量可能的组合,因此很难找到可以与用户想要的城市相对应的城市。

更难的是,很多城市都有他们名字中的文章或者用户可以输入或不能输入的组合名称,文章或文字。 例如,因为我是法国人,所以我将使用这个名为La Rochelle的城市的例子。

用户已经可以使用该城市的名称搜索La Rochelle,Rochelle或La-Rochelle。 如果他想要更精确,他可以在国家之后,甚至之前,甚至国家或两地添加邮政编码......

我找不到任何关于如何通过随机用户输入优化搜索城市的信息。 是否有一些传统方法可以做到这一点?

包含我的城市的表格如下:

CREATE TABLE cities (
id INT PRIMARY KEY,
article TEXT,           - contain the article if there's one, or NULL if not
city_name TEXT,         - the city name capitalized
article_upper TEXT,     - the article in upper case
city_name_upper TEXT,   - the city's name in upper-cases
city_slug TEXT,         - the combination of the article + space + city name all in caps
zipcode TEXT,           - the zip-code
country TEXT            - country where the city is located
);

我所做的是考虑空格或','分隔符并将字符串分成几个单词,然后尝试将这些单词与不同的字段匹配。

除了带有文章或由多个单词组成的名字之外,这种方法还算不错,因为文章(或其他单词)被完全视为一个不同的字段。

这个问题的解决方案是什么,知道强制用户输入或使用单独的字段对我的客户来说是不合适的?

1 个答案:

答案 0 :(得分:1)

这非常适合全文搜索... http://msdn.microsoft.com/en-us/library/ms142571.aspx

我要做的是创建一个摘要表,其中包含来自另一个表中所有列的串联字符串,并将我的全文索引放在该表上。并且,不要在主表中使用TEXT数据类型,使用常规字符串 - varchar(8000)或其他...

select id, article + ' ' + city_name  + ' ' + zipcode  + ' ' + country
into summary
from cities

(您不需要包含大写版本,每个单词只有一个版本。)