我有一个大型数据库(~2700个条目)的词汇表。每行包含一个英语单词,日语等效词以及与此问题无关的其他数据。我已经创建了一个工具来搜索并在表格中显示结果,但我对假名有一个小问题。
日语句子用汉字(汉字)和拼音脚本(假名)混合编写。不是每个人都可以阅读每个汉字,有时相同的汉字有多个读数。在这些情况下,phoetic kana 位于汉字之上 - 这称为假名:
我使用< 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中进行大多数简单查询有基本的了解,但我当然不是专家。我查看了文档,但(至少对我而言)它们不是非常用户友好。也许不是非常适合初学者。我认为可能有某种涉及正则表达式的构造,但我无法弄清楚如何。
有办法做我想做的事吗?
答案 0 :(得分:1)
如How to do a regular expression replace in MySQL?所述,没有用户定义的函数似乎是不可能的(你只能替换显式序列)。
相当脏的解决方案:您可以容忍两个连续日语字符LIKE '勉%強%す%る'
之间的任何内容。我从来没有建议过。
或者,您可以在表格中保留一个可选字段,该字段可能包含假名的版本。
答案 1 :(得分:1)
我建议不要使用LIKE查询,因为你必须在每个字符之间都有一个%(因为你不知道什么时候会出现假名)并且最终可能会产生误报(比如在两者之间出现有效字符)勉强的。
正如@ Jill-JênnVie提到的那样,我建议添加一个新专栏来保存带有假名的文本。
我正在开发一个对韩语文本进行搜索的应用程序。问题是韩语结合会改变角色。例如:
하다 + 아요 = 해요
“하다”是词典形式的动词“to do”,“아요”是标准的礼貌形式共轭。想必你是日语演讲者,所以你知道这样的礼貌形式有多普遍!注意하如何改变해。显然,如果用户试图在字符串“해요”中搜索“하다”,他们将无法找到它。但是如果用户希望在语料库中看到“하다”的所有实例,我们需要能够返回它。
我们的解决方案是两列:“形式”(共轭形式)和“analytic_string”,它将“해요”表示为“하다+아요”。您可以采取类似的方法,并在第二列中包含您的句子而没有假名。
这种方法的主要缺点是你有效地将数据库大小加倍,并且在输入两列具有相同数据的数据时需要特别注意(我在数据库中找到了几行表格和分析字符串中有不同的单词)。优点是您可以轻松搜索数据而忽略假名。
这是您标准的“尺寸与性能”权衡。哪个更重要:数据库的大小还是执行时间?我能想到的任何其他解决方案都涉及返回太多行,然后单独分析它们。