Sql 如何使用URL slug在Postgres中执行查询?

Sql 如何使用URL slug在Postgres中执行查询?,sql,postgresql,Sql,Postgresql,假设我有一个URL,如下所示: www.somewebsite.com/dinning/caseys+grill 我在Postgres中有一个business\u listings表,其中包含一列business\u name。我在表格中有一条记录,上面写着“凯西格栅” 如何查询'caseys+grill'与'Casey's grill' 我需要使用全文搜索吗?我该怎么做呢?既然你不是在搜索普通单词,而是在搜索专有名称,而且你可能还想找到拼写相似的结果,那么你应该使用GIN索引和相似性搜索。既然

假设我有一个URL,如下所示:

www.somewebsite.com/dinning/caseys+grill

我在Postgres中有一个
business\u listings
表,其中包含一列
business\u name
。我在表格中有一条记录,上面写着“凯西格栅”

如何查询
'caseys+grill'
'Casey's grill'


我需要使用全文搜索吗?我该怎么做呢?

既然你不是在搜索普通单词,而是在搜索专有名称,而且你可能还想找到拼写相似的结果,那么你应该使用GIN索引和相似性搜索。

既然你不是在搜索普通单词,而是在搜索专有名称,而且你可能还想找到拼写相似的结果,你应该使用GIN索引和相似性搜索。

这个问题起初看起来很简单,但它是一堆蠕虫

该解决方案应该考虑所有的用例:这仅仅是删除/重写特殊字符的问题吗?你需要考虑拼写错误(是代码>凯西格雷尔)吗?你是否需要考虑与众不同的标记(是<代码>凯西的格栅2?<代码>相同)?你需要考虑缩写(<代码> N-Grie< /代码>与<代码>纽约GRILL < /代码>相同吗?)你是否需要考虑数字(是<代码>第一AV GRILL < /代码>与<代码>第一大道GRILL < /代码>)?

如果是数据库+网站,最简单的方法是直接记录/比较URL段塞

否则,或者如果您不控制URL(如它是搜索框的结果),则可能需要存储/比较解析后的名称。使用DB title和URL slug,可以将名称转换为公共元素。例如,您将常用缩写更改为全文,删除所有特殊字符,删除/添加空格,如果您的语言有重音,您可以删除它们,标准化大小写等。只有您可以找到并应用适当的转换


然后,您可以使用任何合适的比较方法(三角图、简单相等,如查询等)来比较两个已解析的名称。

这个问题一开始看起来很简单,但它是一堆蠕虫

该解决方案应该考虑所有的用例:这仅仅是删除/重写特殊字符的问题吗?你需要考虑拼写错误(是代码>凯西格雷尔)吗?你是否需要考虑与众不同的标记(是<代码>凯西的格栅2?<代码>相同)?你需要考虑缩写(<代码> N-Grie< /代码>与<代码>纽约GRILL < /代码>相同吗?)你是否需要考虑数字(是<代码>第一AV GRILL < /代码>与<代码>第一大道GRILL < /代码>)?

如果是数据库+网站,最简单的方法是直接记录/比较URL段塞

否则,或者如果您不控制URL(如它是搜索框的结果),则可能需要存储/比较解析后的名称。使用DB title和URL slug,可以将名称转换为公共元素。例如,您将常用缩写更改为全文,删除所有特殊字符,删除/添加空格,如果您的语言有重音,您可以删除它们,标准化大小写等。只有您可以找到并应用适当的转换

然后,您可以使用任何合适的比较方法(三元组、纯相等,如查询等)比较两个已解析的名称。

我假设您实际上希望在
business\u name
中使用一段文本值,并且希望这是此特定业务的唯一标识符

您可以创建一个附加列
business\u name\u slug
,并在此列上创建一个

然后,您可以在插入或更新之前创建一个
,将从
business\u name
创建的slug写入此列

棘手的部分是创建一个逻辑

  • 生成企业名称的url友好版本(在博客文章、Githuhib Gists等中应该有一些示例)
  • 避免命名冲突,以便在插入/更新时唯一约束不会引发错误
我假设您实际上想要
业务名称中的一段文本值,并且希望它成为该特定业务的唯一标识符

您可以创建一个附加列
business\u name\u slug
,并在此列上创建一个

然后,您可以在插入或更新之前创建一个
,将从
business\u name
创建的slug写入此列

棘手的部分是创建一个逻辑

  • 生成企业名称的url友好版本(在博客文章、Githuhib Gists等中应该有一些示例)
  • 避免命名冲突,以便在插入/更新时唯一约束不会引发错误

用例搜索
caseys+grill
并查找“caseys Griller”和“caseys Griller”-或者在slug“caseys+grill”时始终查找唯一的“caseys Griller”“已使用?在最终的“/”之前,您想对该部分做什么?我有一个主意…如果我有一列url slug本身该怎么办?用例也可以搜索
caseys+grill
并找到“caseys Griller”和“caseys Griller”-或者在slug为“caseys+grill”时始终找到唯一的“caseys Griller”“已使用?在最终“/”之前,您想对该部分做什么?我有个主意…如果我为url段塞本身设置了一个列,该怎么办?