Edge n-gram 分词器
The edge_ngram
分词器从每个单词的开头生成部分词元(即 n-gram)。它根据指定字符分割文本,并在定义的最小和最大长度范围内生成词元。此分词器对于实现即时搜索功能特别有用。
Edge n-gram 非常适合单词顺序可能变化的自动完成搜索,例如搜索产品名称或地址时。有关更多信息,请参阅自动完成。然而,对于顺序固定的文本,如电影或歌曲标题,Completion Suggester 可能会更准确。
默认情况下,edge n-gram
分词器生成的词元最小长度为 1
,最大长度为 2
。例如,在分析文本 OpenSearch
时,默认配置将生成 O
和 Op
n-gram。这些短 n-gram 通常会匹配到太多不相关的术语,因此需要配置分词器来调整 n-gram 长度。
使用示例
以下示例请求创建一个名为 my_index
的新索引,并配置一个使用 edge_ngram
分词器的分析器。此分词器生成长度为 3–6 个字符的词元,其中字母和符号都被视为有效词元字符
PUT /edge_n_gram_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"tokenizer": "my_custom_tokenizer"
}
},
"tokenizer": {
"my_custom_tokenizer": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 6,
"token_chars": [
"letter" ]
}
}
}
}
}
生成的词元
使用以下请求检查使用该分析器生成的词元
POST /edge_n_gram_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Code 42 rocks!"
}
响应包含生成的词元
{
"tokens": [
{
"token": "Cod",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "Code",
"start_offset": 0,
"end_offset": 4,
"type": "word",
"position": 1
},
{
"token": "roc",
"start_offset": 8,
"end_offset": 11,
"type": "word",
"position": 2
},
{
"token": "rock",
"start_offset": 8,
"end_offset": 12,
"type": "word",
"position": 3
},
{
"token": "rocks",
"start_offset": 8,
"end_offset": 13,
"type": "word",
"position": 4
}
]
}
参数
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
min_gram | 可选 | 整数 | 最小词元长度。默认值为 1 。 |
max_gram | 可选 | 整数 | 最大词元长度。默认值为 2 。 |
custom_token_chars | 可选 | 字符串 | 定义要作为词元一部分处理的自定义字符(例如,+-_ )。 |
token_chars | 可选 | 字符串数组 | 定义要包含在词元中的字符类。词元会根据不属于这些类的字符进行分割。默认包含所有字符。可用类包括 - letter : 字母字符(例如,a 、ç 或 京 )- digit : 数字字符(例如,3 或 7 )- punctuation : 标点符号(例如,! 或 ? )- symbol : 其他符号(例如,$ 或 √ )- whitespace : 空格或换行符- custom : 允许您在 custom_token_chars 设置中指定自定义字符。 |
max_gram 参数限制
max_gram
参数设置分词器生成的词元的最大长度。当搜索查询超出此长度时,可能无法匹配索引中的任何术语。
例如,如果 max_gram
设置为 4
,查询 explore
在索引时将被分词为 expl
。因此,搜索完整术语 explore
将不会匹配索引中的词元 expl
。
为了解决此限制,您可以应用 truncate
词元过滤器将搜索术语缩短到最大词元长度。然而,这种方法存在权衡。将 explore
截断为 expl
可能会导致匹配到不相关的术语,例如 explosion
或 explicit
,从而降低搜索精度。
我们建议仔细平衡 max_gram
值,以确保高效分词,同时最大限度地减少不相关的匹配。如果精度至关重要,请考虑其他策略,例如调整查询分析器或微调过滤器。
最佳实践
我们建议仅在索引时使用 edge_ngram
分词器,以确保存储部分词元。在搜索时,应使用基本分析器来匹配所有查询术语。
配置即时搜索功能
要实现即时搜索功能,请在索引期间使用 edge_ngram
分词器,并在搜索时使用执行最小处理的分析器。以下示例演示了这种方法。
使用 edge_ngram
分词器创建索引
PUT /my-autocomplete-index
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
},
"autocomplete_search": {
"tokenizer": "lowercase"
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 10,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "autocomplete_search"
}
}
}
}
索引包含 product
字段的文档并刷新索引
PUT my-autocomplete-index/_doc/1?refresh
{
"title": "Laptop Pro"
}
此配置确保 edge_ngram
分词器将“Laptop”等术语分解为 La
、Lap
和 Lapt
等词元,从而允许在搜索期间进行部分匹配。在搜索时,standard
分词器简化查询,同时由于小写过滤器,确保匹配不区分大小写。
现在搜索 laptop Pr
或 lap pr
将根据部分匹配检索相关文档
GET my-autocomplete-index/_search
{
"query": {
"match": {
"title": {
"query": "lap pr",
"operator": "and"
}
}
}
}
有关更多信息,请参阅即时搜索。