词干提取
词干提取支持
RediSearch 支持词干提取,即将单词的基本形式添加到索引中。例如,这允许查询“hiring
”也能返回“hire
”和“hired
”的结果。
当前的词干提取支持基于 Snowball 词干提取库,该库支持大多数欧洲语言,以及阿拉伯语等。请参阅下方的“支持的语言”部分。我们希望尽快支持更多语言(如果您需要特定的语言支持,请提交 issue)。
更多详细信息请参阅 Snowball Stemmer 网站。
工作原理?
词干提取将同一单词的不同形式映射到一个共同的词根 - “词干” - 例如,英语词干提取器将 studied、studies 和 study 映射到 studi。因此搜索 studied 也会找到仅包含其他形式的文档。
为了定义在构建索引时应应用哪种语言的词干提取器,您需要为整个索引或特定字段指定 LANGUAGE
参数。更多详细信息请查看 FT.CREATE 语法。
创建包含语言定义的索引
为德语单词 "wort:
" 创建一个索引,包含一个 TEXT
字段 "wort
"
redis> FT.CREATE idx:german ON HASH PREFIX 1 "wort:" LANGUAGE GERMAN SCHEMA wort TEXT
添加单词
添加一些德语中具有相同词干的单词,单词 stück
的所有变体(英语中的 piece
):stück stücke stuck stucke
=> stuck
redis> HSET wort:1 wort stück
(integer) 1
redis> HSET wort:2 wort stücke
(integer) 1
redis> HSET wort:3 wort stuck
(integer) 1
redis> HSET wort:4 wort stucke
(integer) 1
搜索共同词干
搜索“stuck”(德语中表示“piece”)。从 v2.10 开始,仅在创建用于搜索的索引时未指定 LANGUAGE
参数时,才需要指定它。注意,包含“ü
”的单词的结果是 UTF-8 编码的。
redis> FT.SEARCH idx:german '@wort:(stuck)' German
1) (integer) 4
2) "wort:3"
3) 1) "wort"
2) "stuck"
4) "wort:4"
5) 1) "wort"
2) "stucke"
6) "wort:1"
7) 1) "wort"
2) "st\xc3\xbcck"
8) "wort:2"
9) 1) "wort"
2) "st\xc3\xbccke"
支持的语言
支持以下语言,在索引或查询时可以使用小写形式传递给引擎
- 阿拉伯语
- 亚美尼亚语
- 丹麦语
- 荷兰语
- 英语
- 芬兰语
- 法语
- 德语
- 匈牙利语
- 意大利语
- 挪威语
- 葡萄牙语
- 罗马尼亚语
- 俄语
- 塞尔维亚语
- 西班牙语
- 瑞典语
- 泰米尔语
- 土耳其语
- 意第绪语
- 中文(见下文)
中文支持
索引中文文档与索引大多数其他语言的文档不同,因为分词(token 提取)的方式不同。大多数语言可以通过分隔符和空格来区分其 token,但这在中文中并不常见。
中文分词是通过扫描输入文本,并根据预定义的词汇字典检查每个字符或字符序列,然后根据周围的词汇和字符确定最可能的匹配来完成的。
Redis 开源版本为此目的使用了 Friso 中文分词库。这对用户基本是透明的,通常不需要额外的配置。
使用自定义词典
如果您希望使用自定义词典,可以在加载模块时在模块级别进行设置。FRISOINI
参数可以指向包含相关设置和词典文件路径的 friso.ini
文件位置。
请注意,没有默认的 friso.ini
文件位置。RedisSearch 带有自己的 friso.ini
和词典文件,这些文件在构建时已编译到模块二进制文件中。