在 Elasticsearch 中合并令牌过滤器

Merge token filter in Elasticsearch

我试图在阻止某些标签并应用其他过滤器后将其编入索引。这些标签可以由多个词组成。

不过我没能做到的是应用最终令牌过滤器,它从令牌流中输出单个令牌。

所以我希望由多个单词组成的标签被词干化,删除停用词,然后在保存在索引中之前再次加入相同的标记(有点像关键字标记器所做的,但作为过滤器).

我发现无法通过在 Elasticsearch 中应用令牌过滤器的方式来执行此操作:如果我对空格进行令牌化,然后进行词干处理,所有后续的令牌过滤器都会收到这些词干化的单个令牌,而不是整个令牌流,对吗?

例如我想要标签

the fox jumps over the fence

作为一个整体标记保存在索引中作为

fox jump over fence

而不是

fox,jump,over,fence

有什么方法可以做到这一点,而无需在我的应用程序中预处理字符串,然后将其索引为 not_analyzed 字段?

经过一番研究,我发现了这个帖子:

http://elasticsearch-users.115913.n3.nabble.com/Is-there-a-concatenation-filter-td3711094.html

其中有我正在寻找的确切解决方案。

我创建了一个简单的 Elasticsearch 插件,它只提供 Concatenate Token Filter,您可以在以下位置找到它:

https://github.com/francesconero/elasticsearch-concatenate-token-filter

提供最新的答案,以防有人在寻找解决方案时遇到此问题。如果您的用例正在聚合,OP 建议他们需要做什么:

Is there any way of doing this without preprocessing the string in my application and then indexing it as a not_analyzed field?

实际上是解决这个问题的最好方法,因为 Elasticsearch 使用 keywordtext 类型进行映射,而不仅仅是 string 类型,并建议使用多字段(一个 keyword 和一个 text) 用于需要进行全文搜索的聚合用例 (https://www.elastic.co/guide/en/elasticsearch/reference/7.12/text.html#fielddata-mapping-param)。

在 Elasticsearch 的现代版本中,它甚至会拒绝对 text 字段执行聚合,除非 fielddata 在映射中明确设置为 true,警告您如果您不使用多字段,您即将 运行 遇到的性能问题。

现代版本的 Elasticsearch 还提供了将数据预处理到集群中多个字段的功能,如果在索引之前这样做很麻烦的话 (https://www.elastic.co/guide/en/elasticsearch/reference/7.12/ingest.html)。