我有包含希腊字符的搜索索引。许多人不知道如何打字希腊语,所以他们输入一个叫做“beta-code”的东西。 Beta代码可以转换为希腊语。例如,beta代码“NO / MOU”将转换为“νόμου”。斜杠或括号等字符用于表示重音。
我希望用户能够使用希腊语脚本中的beta代码或文本进行搜索。我发现Whoosh Variations类提供了我需要的机制,它几乎解决了我的问题。
除了使用斜杠或括号表示用户查询中的重音之外,Variation类运行良好。问题是查询被解析,使得用于表示重音的特殊字符导致被分割的单词。例如,搜索“NO / MOU”会导致变体类被要求查找“no”和“mou”的变体而不是“NO / MOU”。
是否有办法影响查询的解析方式,以便在搜索词中包含斜杠和括号(即搜索“NO / MOU”会导致搜索“”NO / MOU“的标记”而不是“不”和“谅”)?
答案 0 :(得分:1)
搜索解析器使用Tokenizer类将搜索字符串分解为单个术语。 Whoosh将使用与架构关联的类。例如,下面的情况,SimpleAnalyzer()将在搜索“content”字段时使用。
Schema( verse_id = NUMERIC(unique=True, stored=True),
content = TEXT(analyzer=SimpleAnalyzer()) )
默认情况下,SimpleAnalyzer()使用以下正则表达式来标记搜索词:“\ w +(。?\ w +)*”
要使用其他正则表达式,请将SimpleAnalyzer的第一个参数指定给另一个正则表达式。例如,要在标记中包含beta代码字符(斜杠,括号等),请使用以下SimpleAnalyzer:
SimpleAnalyzer( rcompile(r"[\w/*()=\+|&']+(\.?[\w/*()=\+|&']+)*") )
搜索现在允许术语包含特殊的beta代码字符,Variations类可以将术语转换为unicode版本。