我试图编写一个查询,它会在数据库中找到类似的地址。
例如,用户可能输入可能不正确的各种地址。应该显示类似的地址作为结果。
例如,用户可能会搜索 -
"177 pleasant street"
"177 pleasant st"
"177 pleasant road"
我该如何实现?
到目前为止,我已经尝试过了 -
SELECT * FROM Table WHERE Address LIKE '%177 pleasant st%' AND ...etc...
答案 0 :(得分:1)
我会考虑使用full text search代替。
最大的好处是它有助于拼写(愉快,愉快,愉快等)。当然,它主要基于语言学而非地理学相似来匹配相似性。
答案 1 :(得分:0)
这不是一件容易的事。
您应该提取搜索字符串的实体和存储的字符串,并比较相同类型的实体。
在你的例子中:
street_number:字符串的数字部分。
street_name:字符串的非数字部分,不包括字典{street,st,road}中的字词
如果street_number和street_name MATCH,您可以返回该地址。
对于一般情况提取实体很困难,您可以使用工具来帮助您。
检查:https://developers.google.com/maps/documentation/javascript/geocoding
答案 2 :(得分:0)
SOUNDEX
函数可以完成基本匹配。
SELECT * FROM [Table] WHERE SOUNDEX([Address]) = SOUNDEX('177 pleasant st')
如果您想通过百分比的关键字匹配&#39; 进一步自定义搜索,您可以去实施 Jaro Winkler算法 < / strong>在存储过程中为您进行匹配。您可以开始阅读有关Jaro Winkler here的内容。否则,如前所述,您可能需要使用匹配工具。
另请查看here
答案 3 :(得分:0)
这取决于你想要达到的目标。通过它的外观无论什么要求,最重要的信息是“177”和“愉快”和“道路”(来自您原始数据库的信息)。因此,如果只有三个搜索参数,那么您可以使用下面的简单查询。如果您想使用更多,那么您将不得不使用全文搜索。
DECLARE @DataFromUserInterFace varchar(300)
SET @DataFromUserInterFace='177 pleasant street'
SELECT
[Address]
FROM
[Employer]
WHERE
CHARINDEX
(
substring([Address], 1, CHARINDEX(' ', [Address], 1)-1)
, @DataFromUserInterFace
, 1)!=0
OR
CHARINDEX
(
substring
([Address]
, CHARINDEX(' ', [Address], 1)+1
, CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)
-CHARINDEX(' ', [Address], 1)-1)
, @DataFromUserInterFace
, 1)
!=0
OR
CHARINDEX
(
substring([Address], CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)+1,
CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)
-CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)-1)
)
, @DataFromUserInterFace
, 1)
!=0
答案 4 :(得分:-1)
如果您将地址标准化一点,任务将变得更容易或至少更准确。将地址分成它自己的表,如下所示:
Create table Address(
AddressKey int not null ,
addressnumber nvarchar(10),
street nvarchar (50),
streetSuffix nvarchar (10)
... (city,state,zip,etc.)
)
然后,您的查询可以指定要搜索相似内容的地址的哪个部分。
Select *
from table t inner join
address a on a.addresskey=t.addresskey
Where a.street = 'pleasant'
and a.streetnumber='177'
注意:我将街道号码作为nvarchar来容纳'23A'类型的东西,但即使这样也可以打破。