【问题标题】:How can I find a city and country based on a user search?如何根据用户搜索找到城市和国家?
【发布时间】:2011-04-14 19:13:46
【问题描述】:

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

“美国旧金山的酒店”或“纽约州纽约”或“Paris sddgdfgxx”或“加拿大多伦多”这些术语并非总是用逗号分隔,也没有特定的顺序,可能存在无用的数据。

这是我尝试过的:

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

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

方法2:这实际上是一个反向搜索,它的逻辑是搜索用户输入的字符串是否包含我表中的任何城市或国家。这样我就可以确定搜索了“Aix en Provence”或“New York”。

ex: select * from cityCountryNames where 'Ontario, Canada, Toronto' like cityCountryNames

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

感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    Google 和 Bing 等地图服务比您或我更好地解决了这个问题,那么为什么不利用他们所做的所有工作呢?

    【讨论】:

    • 使用某些地理编码 API 有查询限制,有些甚至禁止访问用于商业用途。所以一定要阅读细则
    • @Mikos - 这当然总是一个好主意。如果您要在地图上显示地理编码点,Google 允许使用他们的地理编码 API。看起来 Bing 可能有更严格的使用条款。
    【解决方案2】:

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

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

    2. 使用用户键入的字符串查询 solr,瞧,第一个匹配是最佳匹配。 因此,即使用户键入“Paris sddgdfgxx”,Paris 也应该是您的第一个目标。如果您想变得更复杂,请使用 n-gram 方法(称为 Lucene Shingles

    由于 Solr 提供 RESTful (HTTP) API,因此应该可以轻松集成到您使用的任何平台中。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多