You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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”过滤器。现咨询两个问题:

  1. 是否存在可从term vector中移除令牌的过滤器,或有更优实现方式?
  2. 哪里可以找到条件脚本中“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:50:23