首页 > 解决方案 > 如何在 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 tsvectortsquery但是这些功能的本地化功能侧重于词典权重(删除单词the等)而不是字符/单词。

上面的例子可能有点牵强,但是我们有一个基于以下的更简单的例子

案例2

tbl_place

+---+---------+
|id |  value  |
+---+---------+
| 1 | кафе    |
| 2 | Cafe    |
| 3 | café    |
+---+---------+

在这里,单词的输入cafe应该乐观地导致所有 3 但如果不是至少最后 2cafecafé

当前解决方案

我的假设是,如果没有正确的翻译(这在名称中几乎是不可能的),唯一的另一种方法是使用字符映射,即在输入中替换德语ßss生成一个结果表:

tbl_value

+---+---------+------------------+
|id |  value  | normalized_value |
+---+---------+------------------+
| 1 | vögel   | voegel           |
| 2 | straße  | strasse          |
+---+---------+------------------+

这需要一种标准化方法,但即使这样也有问题。在德语中,该字符ö等同于oe但是vogel通过省略变音符号的输入应该是可以接受的。

提案

根据我目前的解决方案,我们将构建多个映射来匹配我们能想到的每个输入。然而,我怀疑这种方法的效率、输出和可扩展性。

还有其他可以帮助我们的解决方案吗?无论是软件、逻辑代码解决方案、postgres 中的本地化/额外词典的配置等等等。

标签: postgresqlelasticsearchsearchmultilingual

解决方案


推荐阅读