postgresql - 如何在 pgsql 中处理多语言搜索
问题描述
我们需要创建一个可以处理多语言输入的搜索。原因是我们正在使用名称字段并且允许使用任何语言。您可以在下面看到一个说明性示例:
情况1
tbl_users
+---+---------+
|id | value |
+---+---------+
| 1 | Chris |
| 2 | Крис |
| 3 | Χρήστος |
| 4 | Akçay |
+---+---------+
在上表中,我们在前 3 行中出现了相同的名称,但所有 3 行都使用不同的字母(拉丁文、希腊文、西里尔文),然后在第 4 行中出现了带有额外字符的拉丁文(另一个例子是德语 ö ETC)
搜索的目的是能够处理所有这些,但也能处理拉丁文输入。IE
input: Kris -> should result in Крис
input: Akcay -> should result in Akçay
由于我们将使用我正在研究的 postgres tsvector
,tsquery
但是这些功能的本地化功能侧重于词典权重(删除单词the
等)而不是字符/单词。
上面的例子可能有点牵强,但是我们有一个基于以下的更简单的例子
案例2
tbl_place
+---+---------+
|id | value |
+---+---------+
| 1 | кафе |
| 2 | Cafe |
| 3 | café |
+---+---------+
在这里,单词的输入cafe
应该乐观地导致所有 3 但如果不是至少最后 2cafe
和café
。
当前解决方案
我的假设是,如果没有正确的翻译(这在名称中几乎是不可能的),唯一的另一种方法是使用字符映射,即在输入中替换德语ß
并ss
生成一个结果表:
tbl_value
+---+---------+------------------+
|id | value | normalized_value |
+---+---------+------------------+
| 1 | vögel | voegel |
| 2 | straße | strasse |
+---+---------+------------------+
这需要一种标准化方法,但即使这样也有问题。在德语中,该字符ö
等同于oe
但是vogel
通过省略变音符号的输入应该是可以接受的。
提案
根据我目前的解决方案,我们将构建多个映射来匹配我们能想到的每个输入。然而,我怀疑这种方法的效率、输出和可扩展性。
还有其他可以帮助我们的解决方案吗?无论是软件、逻辑代码解决方案、postgres 中的本地化/额外词典的配置等等等。
解决方案
推荐阅读
- python-3.x - 在python中删除复数
- laravel - 离开文本字段后 Laravel livewire 元素给出错误 419
- mongodb - Mongo DB - UpdateMany 列数据
- python - tensorflow 2.x 可以在最新的 Python 上运行吗?
- pine-script - strategy.entry() 没有在应该开仓的时候开仓
- ansible - 使用 Ansible 的日期时差
- ios - 如何防止 Chrome-in-iOS 上的双击放大
- java - 抽象类中的抽象属性
- javascript - 事件循环在 Javascript 中是如何工作的?
- javascript - 我的整个网站在响应模式下被推到左边如何找到问题?