如何根据用户搜索查找城市和国家/地区?

时间:2010-09-20 17:08:43

标签: sql-server full-text-search search-engine

我正在尝试根据用户输入类型文本搜索引用和国家/地区的SQL Server 2008表(包含大约700万条记录)。我从用户那里得到的搜索字符串可以是:

“美国旧金山的酒店”或“纽约,纽约”或“巴黎sddgdfgxx”或“多伦多加拿大”条款并非总是用逗号分隔,而不是按特定顺序分隔,并且可能存在无用的数据。

这就是我的尝试:

方法1:FTS包含: 例如:select * from cityNames where where(cityname,'word1 and word2') - with AND     select * from cityNames where where(cityname,'word1 or word2') - with OR

这不能很好地工作,因为像'sddgdfgxx'这样的术语如果与'AND'一起使用则不会返回任何内容。使用OR将适用于像'Paris'这样的单词城市,但不适用于'San Diego'或'San Francisco'

方法2:这实际上是反向搜索,它的逻辑是搜索用户输入字符串是否包含我表中的任何城市或国家/地区。这样我就可以肯定地搜索了“普罗旺斯地区艾克斯”或“纽约”。

ex:select * from cityCountryNames,其中'Ontario,Canada,Toronto'喜欢cityCountryNames

注意:我无法获得两个单词城市的结果,查询速度很慢。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我强烈建议使用像Google Geocoding API这样的第三方API来获取此类输入并将其解析为具有离散部分的位置(街道地址,城市,州,国家等)然后您可以使用必要时搜索数据库的那些离散部分。

谷歌和必应等地图服务比你或我更好地解决了这个问题,为什么不利用他们所做的所有工作呢?

答案 1 :(得分:0)

SQL不是针对您正在执行的查询类型而设计的,当然不是为了扩展。 我的建议如下:

  1. 将您的所有地点(城市+国家/地区)编入Solr索引。 Solr是一个使用Lucene构建的FOSS搜索服务器,可以在几毫秒或更短的时间内轻松查询7MM记录索引。

  2. 使用用户输入的字符串查询solr,并且第一场比赛是最佳匹配。 所以即使用户输入“Paris sddgdfgxx”,巴黎应该是你的第一个热门。如果你想要真正复杂的使用n-gram方法(称为Lucene Shingles

  3. 由于Solr提供的RESTful(HTTP)API应该可以轻松集成到您所在的任何平台中。