0

背景

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

期望的行为

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

问题

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

问题

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

4

1 回答 1

1

搜索解析器使用 Tokenizer 类将搜索字符串分解为单独的术语。Whoosh 将使用与模式关联的类。例如,在下面的情况下,搜索“内容”字段时将使用 SimpleAnalyzer()。

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

于 2013-02-18T21:52:45.440 回答