我们有一个 SQL 2008 数据库,其中包含 2000 万多个 geoWe 位置(并且还在增长),每个位置都包含标准的名称/地址/地理/ID/等列。
我们需要一种基于距离有效搜索记录的方法,还需要通过全文索引“包含”关键字。基本思想是我们根据最大距离搜索我们附近的位置。
现在,当我们在 1 英里内搜索完整的字符串(例如星巴克)时,搜索会在几秒钟内返回。但是,如果我们在 1 英里内搜索“星”,搜索有时可能需要几分钟才能返回。
我们一直在玩这样的逻辑:
DECLARE @geoSearchLocation GEOGRAPHY, @geoSearchPolygon GEOGRAPHY, @returncount smallint = 50
SET @geoSearchLocation = geography::Point(40.729047, -74.010086, 4326); --NYC
SET @geoSearchPolygon = geography::STGeomFromText('POLYGON((-74.015086 40.734047,
-74.015086 40.718047,
-74.005086 40.718047,
-74.005086 40.734047,
-74.015086 40.734047))', 4326);
SET @geoSearchLocation = geography::Point(40.729047, -73.010086, 4326);
SELECT TOP (100) --WITH TIES
*, gt.LocationGeog.STDistance(@geoSearchLocation) AS dist
FROM dbo.GeoLocation_Locations gt WITH (NOLOCK, INDEX(geolocation_HHHH128_sidx))
WHERE gt.LocationGeog.STIntersects(@geoSearchPolygon) = 1
ORDER BY gt.LocationGeog.STDistance(@geoSearchLocation)
然而,这在搜索中引入了欺骗和其他问题。我们也一直在尝试使用我们在网上找到的 POWER 论坛。
我们还有其他查询效果很好,它们仅基于距离或某个类别 ID,它们会在一秒钟内返回。最大的问题是通配符字符串匹配。
在处理超过 2000 万条记录时,有没有人有一个很棒的 SQL 或 CLR proc 可以接受名称(通配符支持)和距离?
现在我们很困:(
在此先感谢,杰夫