Elasticsearch:词分析中的 Normalizer 的使用
2022年11月10日 | by mebius
在 Elasticstgcodeearch 的词分析中,normalizer 与 analyzer 类似,只是它们只能发出一个 token。 因此,它们没有 tokenizer,只接受可用 char filters 和 token filters 的子集。 只允许使用基于每个字符的过滤器。 例如,允许使用 lowercase 过滤器,但不允许使用 stemming filter(词干过滤器),它需要将关键字视为一个整体。 当前可以在规范化器中使用的过滤器列表如下:arabic_normalization、asciifolding、bengali_normalization、cjk_width、decimal_digit、elision、german_normalization、hindi_normalization、indic_normalization、lowercase、persian_normalization、scandinavian_folding、serbian_normalization、sorani_normalization、uppercase。
Elasticsearch 附带了一个 lowercase 的内置 normalizer。 对于其他形式的规范化,需要自定义配置。在之前的一个中文简体及繁体的示例中有展示。请参阅文章 “Elasticsearch:简体繁体转换分词器 – STConvert analysis”。
定制 normalizers
如上所述,定制的 normalizer 采用一个或多个char filtes 和一个或多个token filters。比如,我们定义如下的一个索引:
PUT my_index
{
"settings": {
"analysis": {
"char_filter": {
"quote": {
"type": "mapping",
"mappings": [
" => "",
" => ""
]
}
},
"normalizer": {
"my_normalizer": {
"type": "custom",
"char_filter": [
"quote"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"properties": {
"foo": {
"type": "keyword",
"normalizer": "my_normalizertgcode"
}
}
}
}
在上面,我们在 normalizer 的定义中,我们使用了一个 char filter。它把 及 字符转换为引号 “。同时它也对字母进行小写及 asciifolding。我们现在以如下的一个文档来进行展示:
PUT my_index/_doc/1
{
"foo": "aa la Carte"
}
根据我们上面定义的 normalizer,我们可以看出来上面的字段 foo 有且仅有一个 token:”acai a la carte”,这是因为 及 字符转换为引号 “,而 “aa la Carte” 经过 asciifolding 过滤器后,变为acai a la Carte。再经过 lowercase 的过滤器,它就变为”acai a la carte”。
针对上面的索引,我们可以进行如下的搜索:
GET my_index/_tgcodesearch
{
"query": {
"match": {
"foo": ""acai a la carte""
}
}
}
上面返回的结果是:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "my_index",
"_id": "1",
"_score": 0.2876821,
"_source": {
"foo": "aa la Carte"
}
}
]
}
}
文章来源于互联网:Elasticsearch:词分析中的 Normalizer 的使用
相关推荐: Elasticsearch:在 Java 客户端中使用 scroll 来遍历搜索结果 – Elastic Stack 8.x
如果你搜索不经常更改的文档,则使用标准查询的分页效果非常好; 否则,使用实时数据执行分页会返回不可预测的结果。 为了绕过这个问题,Elasticsearch 在查询中提供了一个额外的参数:scroll。如果你对搜索结果分页不是很熟悉的话,请参考我之前的文章 “…