在标记中包含斜杠和括号

时间:2013-02-18 08:19:52

标签: whoosh

背景

我有包含希腊字符的搜索索引。许多人不知道如何打字希腊语,所以他们输入一个叫做“beta-code”的东西。 Beta代码可以转换为希腊语。例如,beta代码“NO / MOU”将转换为“νόμου”。斜杠或括号等字符用于表示重音。

期望的行为

我希望用户能够使用希腊语脚本中的beta代码或文本进行搜索。我发现Whoosh Variations类提供了我需要的机制,它几乎解决了我的问题。

问题

除了使用斜杠或括号表示用户查询中的重音之外,Variation类运行良好。问题是查询被解析,使得用于表示重音的特殊字符导致被分割的单词。例如,搜索“NO / MOU”会导致变体类被要求查找“no”和“mou”的变体而不是“NO / MOU”。

问题

是否有办法影响查询的解析方式,以便在搜索词中包含斜杠和括号(即搜索“NO / MOU”会导致搜索“”NO / MOU“的标记”而不是“不”和“谅”)?

1 个答案:

答案 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版本。