# 渗滤型

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

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

贡献者 : [李亚运](/display/~liyayun)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

## 简述

`percolator`字段类型将json结构解析为本地查询，并存储该查询，以便[percolate查询](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html)可以使用它来匹配提供的文档。

包含json对象的任何字段都可以配置为渗滤器字段。 渗滤器字段类型没有参数设置。 只需配置渗`percolator`字段类型就足以指示ES将字段视为查询。

如果以下映射配置`query`字段的`percolator`字段类型：

```
{
    "properties": {
        "query": {
            "type": "percolator"
        }
    }
}
```

那么下面的json代码段可以作为本地查询进行索引：

```
{
    "query" : {
                "match" : {
                        "field" : "value"
                }
        }
}
```

![重要](img/df52133cde1ccbe8fb4286d42142cf1e.jpg)

在渗滤型查询中引用的字段必须已经存在于与用于渗滤的索引相关联的映射中。 为了确保这些字段存在，通过[创建索引](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html)或[放置映射](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html) API添加或更新映射 。 在渗滤型查询中引用的字段可以存在于包含`percolator`字段类型的任何类型的索引中。

此外，索引只能包含多达一个渗滤型字段映射。 多个字段将被put索引拒绝并放置映射API。

## 专用渗透索引

渗滤型查询可以添加到任何索引。 而不是向数据所在的索引添加渗出查询，也可以将这些查询添加到专用索引中。 这样做的优点在于，这个专用的渗透索引可以有自己的索引设置（例如主分片和副本分片的数量）。 如果您选择具有专门的渗透指数，则需要确保来自正常索引的映射也可在渗透指数中使用。 否则，渗出查询可能会被错误解析。

## 强制未映射的字段被处理为字符串 

在某些情况下，什么样的渗滤查询已经被注册了是不知道的，如果字段未映射的那些字段被渗透查询所引用，那么将添加渗滤查询失败。 这意味着需要更新映射以使该字段具有适当的设置，然后可以添加渗滤查询。 但是有时如果所有未映射的字段都被处理，就像这些是默认的字符串字段一样。 在这种情况下，可以将`index.percolator.map_unmapped_fields_as_string`设置设置为`true` （默认为`false` ），然后如果在percolator查询中引用的字段不存在，则它将作为默认字符串字段处理，以便添加渗滤查询不会失败。

## 限制

因为`percolate`查询一次处理一个文档，它不支持针对子文件，如`has_child`和`has_parent`运行的查询和过滤器。

 在查询解析过程中有许多通过调用进行获取数据的查询。 例如使用`terms`查询时的术语查询，使用索引脚本时的`template`查询以及使用预索引形状时的`geo_shape` 。 当这些查询由`percolator`字段类型索引时，get调用将被执行一次。 因此，每次`percolator`查询评估这些查询时，将使用索引时间获取术语，形状等。如果源索引在索引时更改,需要注意的是要获取这些查询所执行的术语，每次在渗滤器查询在主分片和副本分片上进行索引时都会发生，所以实际索引的术语在分片副本之间可能不同。