MySQL正则表达式与日本假名

时间:2012-05-27 00:21:03

标签: mysql regex cjk ruby-characters

我有一个大型数据库(~2700个条目)的词汇表。每行包含一个英语单词,日语等效词以及与此问题无关的其他数据。我已经创建了一个工具来搜索并在表格中显示结果,但我对假名有一个小问题。

日语句子用汉字(汉字)和拼音脚本(假名)混合编写。不是每个人都可以阅读每个汉字,有时相同的汉字有多个读数。在这些情况下,phoetic kana 位于汉字之上 - 这称为假名

enter image description here

我使用< ruby​​>向用户呈现这些语音读数。标签格式如下:

<ruby>
  <rb>勉強</rb>    <!-- the kanji -->
  <rp>(</rp>      <!-- define where the phonetic part starts in the string -->
    <rt>べんきょう</rt>   <!-- the phonetic kana itself -->
  <rp>)</rp>      <!-- define the end of the phonetic part -->
</ruby>する        <!-- the last part is already phonetic so needs no ruby -->

字符串存储在我的数据库中,如下所示:

勉強(べんきょう)する

括号之间的任何内容都是紧接在它之前的汉字的读数。以这种方式存储字符串允许回退不支持ruby标记的浏览器(例如,令人惊讶的是,Firefox)。

所有这一切都很好,但问题出现在用户搜索时。如果他们搜索

勉強

然后它会出现。但如果他们试图搜索

勉強する

它不起作用,因为在数据库中有一个字符串定义中间的语音发音。

上例中的全角括号仅用于表示此语音脚本。鉴于此,我正在寻找一种方法来基本上告诉MySQL搜索忽略它在圆括号之间找到的任何东西。我对如何在MySQL中进行大多数简单查询有基本的了解,但我当然不是专家。我查看了文档,但(至少对我而言)它们不是非常用户友好。也许不是非常适合初学者。我认为可能有某种涉及正则表达式的构造,但我无法弄清楚如何。

有办法做我想做的事吗?

2 个答案:

答案 0 :(得分:1)

How to do a regular expression replace in MySQL?所述,没有用户定义的函数似乎是不可能的(你只能替换显式序列)。

相当脏的解决方案:您可以容忍两个连续日语字符LIKE '勉%強%す%る'之间的任何内容。我从来没有建议过。

或者,您可以在表格中保留一个可选字段,该字段可能包含假名的版本。

答案 1 :(得分:1)

我建议不要使用LIKE查询,因为你必须在每个字符之间都有一个%(因为你不知道什么时候会出现假名)并且最终可能会产生误报(比如在两者之间出现有效字符)勉强的。

正如@ Jill-JênnVie提到的那样,我建议添加一个新专栏来保存带有假名的文本。

我正在开发一个对韩语文本进行搜索的应用程序。问题是韩语结合会改变角色。例如:

하다 + 아요 = 해요

“하다”是词典形式的动词“to do”,“아요”是标准的礼貌形式共轭。想必你是日语演讲者,所以你知道这样的礼貌形式有多普遍!注意하如何改变해。显然,如果用户试图在字符串“해요”中搜索“하다”,他们将无法找到它。但是如果用户希望在语料库中看到“하다”的所有实例,我们需要能够返回它。

我们的解决方案是两列:“形式”(共轭形式)和“analytic_string”,它将“해요”表示为“하다+아요”。您可以采取类似的方法,并在第二列中包含您的句子而没有假名。

这种方法的主要缺点是你有效地将数据库大小加倍,并且在输入两列具有相同数据的数据时需要特别注意(我在数据库中找到了几行表格和分析字符串中有不同的单词)。优点是您可以轻松搜索数据而忽略假名。

这是您标准的“尺寸与性能”权衡。哪个更重要:数据库的大小还是执行时间?我能想到的任何其他解决方案都涉及返回太多行,然后单独分析它们。