如何从Elasticsearch term vector中移除所有数字?
Elasticsearch 词向量过滤问题
我希望Elasticsearch的term vector中仅保留真实文本/单词,移除数字及无效字符串。以下是我的索引定义:
{ "mappings": { "_source": { "enabled": true }, "properties": { "attachment.content": { "analyzer": "english_analyzer", "term_vector": "yes", "type": "text" }, "class": { "type": "integer" }, "label": { "type": "integer" } } }, "settings": { "analysis": { "analyzer": { "english_analyzer": { "filter": [ "english_possessive_stemmer", "lowercase", "english_stop", "english_stemmer" ], "tokenizer": "standard", "type": "custom" } }, "filter": { "english_possessive_stemmer": { "language": "possessive_english", "type": "stemmer" }, "english_stemmer": { "language": "english", "type": "stemmer" }, "english_stop": { "stopwords": "_english_", "type": "stop" } } }, "number_of_shards": 1 } }
我尝试使用如下条件令牌过滤器:
{ "type": "condition", "filter": [ "remove" ], "script": { "source": "token.getType() == '<NUM>'" } }
但我不知道当条件满足时如何移除令牌,显然不存在“remove”过滤器。现咨询两个问题:
- 是否存在可从term vector中移除令牌的过滤器,或有更优实现方式?
- 哪里可以找到条件脚本中“source”部分的相关文档?
问题解答
1. 移除数字令牌的实现方式
不存在直接叫“remove”的过滤器,但可以通过两种方式实现移除数字令牌的需求:
方式一:使用pattern_replace过滤器结合条件过滤器
先通过条件过滤器判断令牌是否为数字,再用pattern_replace把匹配的令牌替换为空字符串,空令牌会被Elasticsearch自动过滤掉。修改后的过滤器配置如下:
"filter": { "english_possessive_stemmer": { "language": "possessive_english", "type": "stemmer" }, "english_stemmer": { "language": "english", "type": "stemmer" }, "english_stop": { "stopwords": "_english_", "type": "stop" }, "remove_numbers": { "type": "condition", "filter": ["empty_token"], "script": "token.getType() == '<NUM>'" }, "empty_token": { "type": "pattern_replace", "pattern": ".+", "replacement": "" } }
然后把remove_numbers添加到你的english_analyzer的过滤器列表中,注意顺序要放在lowercase之后、english_stop之前:
"english_analyzer": { "filter": [ "english_possessive_stemmer", "lowercase", "remove_numbers", "english_stop", "english_stemmer" ], "tokenizer": "standard", "type": "custom" }
方式二:使用stop过滤器自定义停用词(针对固定格式数字)
如果你的数字格式比较固定(比如仅包含0-9的单个数字),可以把所有可能的数字形式加入停用词列表,用stop过滤器直接过滤。但这种方式灵活性差,不适用于任意数字场景,更推荐第一种方式。
2. 条件脚本source部分的文档
条件过滤器的脚本基于Elasticsearch的分词脚本API,脚本中可用的核心属性和方法包括:
token.getType():获取令牌类型,比如<NUM>代表数字,<ALPHANUM>代表字母数字混合等token.getText():获取令牌的原始文本内容token.setToken():修改令牌的文本内容token.getPositionIncrement():获取令牌的位置增量
这些内容对应Lucene的Token接口公开方法,相关细节可以在Elasticsearch官方文档的分词器脚本章节中找到,核心是围绕分词过程中令牌的操作逻辑展开的。
内容的提问来源于stack exchange,提问作者Bumblebee
相关产品推荐
相关产品推荐

