# 过滤器改变

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_percolator.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_percolator.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260766](http://www.apache.wiki/pages/viewpage.action?pageId=4260766)

贡献者 : [片刻](/display/~jiangzhonglian)

## 渗滤器接近实时

以前的渗滤器被实时激活，即，一旦它们被索引。现在，只要刷新了索引，percolate查询的更改就会在接近实时的时间内可见。需要进行此更改，因为在从5.0开始创建的索引中，渗透器查询中使用的术语会自动编入索引，以便在渗透期间进行更有效的查询选择。

## 渗滤和多渗滤API

过滤器和多渗析物API已被弃用，并将在下一个主要版本中删除。这些API已被可以在搜索和多搜索API中使用的percolate查询所替代。

## 渗透器字段映射

.percolator类型不能再用于索引percolator查询。

相反，必须在对过滤器查询进行索引之前配置[过滤器字段类型](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/percolator.html)。

仍然可以使用在5.0.0之前的版本上创建的.percolator类型的索引，但新索引不再接受.percolator类型。

但是强烈建议重新索引包含在升级到Elasticsearch 5之前创建的percolate查询的任何索引。通过这样做，渗透查询利用提取的术语从渗透器查询中提取的percolate字段类型，并且可能执行速度快多倍。

## Percolate文档映射

percolate查询不再修改映射。在percolate API之前可以用来动态地引入新的字段到基于正被percolated的文档中的字段的映射。这不再工作，因为这些未映射字段不会持久保存在映射中。

## 由搜索返回的渗透文档

具有.percolate类型的文档先前已从搜索响应中排除，除非在搜索请求中明确指定.percolate类型。现在，过滤器文档的处理方式与任何其他文档相同，并由搜索请求返回。

## 渗透现有文档

当渗透现有文档时，也不再允许在渗出查询中指定文档作为源。之前的percolate API允许并忽略现有文档。

## Percolate统计

滤液的数据已被删除。这是因为渗透器不再缓存渗透器查询。

## 包含具有现在范围的范围查询的Percolator查询

渗透器不再接受包含范围查询的渗透查询，范围查询的范围基于当前时间（使用now）。

## 包含脚本的Percolator查询

包含没有指定明确语言的脚本（例如：script query或function_score查询脚本函数）的Percolator查询将使用版本5.0及更高版本的Painless脚本语言。

在版本5.0之前创建的索引中存储的渗透器查询中未设置显式语言的脚本将使用已在script.legacy.default_lang设置中配置的语言。此设置默认为Groovy脚本语言，这是5.0之前的版本的默认语言。如果您的默认脚本语言不同，请将script.legacy.default_lang设置设置为您以前使用的语言。

为了使用新的percolator字段类型，所有渗透器查询应重新索引到一个新的索引。当使用没有明确语言定义到新索引的脚本重新建立过滤器查询索引时，应该执行以下两项操作之一以使脚本工作：*（推荐方法）在重建索引过滤器文档时，将脚本迁移到无痛脚本语言。 *或在脚本中添加lang参数，并设置它们写入这些脚本的语言。

## Java客户端

渗透器不再是核心弹性搜索依赖项的一部分。它已移至渗透器模块。因此，当使用来自Java客户端的过滤器功能时，新的渗透器模块也应该在类路径上。此外，传输客户端应该将渗析器模块作为插件加载：

```
TransportClient transportClient = TransportClient.builder()
        .settings(Settings.builder().put("node.name", "node"))
        .addPlugin(PercolatorPlugin.class)
        .build();
transportClient.addTransportAddress(
        new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300))
);
```

已删除来自Client界面的渗滤器和多渗出相关方法。 这些API已被弃用，建议在搜索或多搜索API中使用percolate查询。 然而，渗出物和多渗出物API仍然可以从Java客户端使用。

使用渗滤液请求：

```
PercolateRequest request = new PercolateRequest();
// set stuff and then execute:
PercolateResponse response = transportClient.execute(PercolateAction.INSTANCE, request).actionGet();
```

使用渗滤请求生成器：

```
PercolateRequestBuilder builder = new PercolateRequestBuilder(transportClient, PercolateAction.INSTANCE);
// set stuff and then execute:
PercolateResponse response = builder.get();
```

使用多渗滤请求：

```
MultiPercolateRequest request = new MultiPercolateRequest();
// set stuff and then execute:
MultiPercolateResponse response = transportClient.execute(MultiPercolateAction.INSTANCE, request).get();
```

使用多渗滤请求生成器：

```
MultiPercolateRequestBuilder builder = new MultiPercolateRequestBuilder(transportClient, MultiPercolateAction.INSTANCE);
// set stuff and then execute:
MultiPercolateResponse response = builder.get();
```