条件标记过滤器

编辑

将一组标记过滤器应用于与提供的谓词脚本中的条件匹配的标记。

此过滤器使用 Lucene 的 ConditionalTokenFilter

示例

编辑

以下 分析 API 请求使用 condition 过滤器来匹配 THE QUICK BROWN FOX 中少于 5 个字符的标记。然后,它将 lowercase 过滤器应用于那些匹配的标记,将它们转换为小写。

resp = client.indices.analyze(
    tokenizer="standard",
    filter=[
        {
            "type": "condition",
            "filter": [
                "lowercase"
            ],
            "script": {
                "source": "token.getTerm().length() < 5"
            }
        }
    ],
    text="THE QUICK BROWN FOX",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      {
        type: 'condition',
        filter: [
          'lowercase'
        ],
        script: {
          source: 'token.getTerm().length() < 5'
        }
      }
    ],
    text: 'THE QUICK BROWN FOX'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "standard",
  filter: [
    {
      type: "condition",
      filter: ["lowercase"],
      script: {
        source: "token.getTerm().length() < 5",
      },
    },
  ],
  text: "THE QUICK BROWN FOX",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "condition",
      "filter": [ "lowercase" ],
      "script": {
        "source": "token.getTerm().length() < 5"
      }
    }
  ],
  "text": "THE QUICK BROWN FOX"
}

该过滤器生成以下标记

[ the, QUICK, BROWN, fox ]

可配置参数

编辑
filter

(必需,标记过滤器数组)标记过滤器数组。如果标记与 script 参数中的谓词脚本匹配,则按照提供的顺序将这些过滤器应用于该标记。

这些过滤器可以包括在索引映射中定义的自定义标记过滤器。

script

(必需,脚本对象)用于应用标记过滤器的谓词脚本。如果标记与此脚本匹配,则将 filter 参数中的过滤器应用于该标记。

有关有效参数,请参阅如何编写脚本。仅支持内联脚本。Painless 脚本在 分析谓词上下文 中执行,并且需要 token 属性。

自定义并添加到分析器

编辑

要自定义 condition 过滤器,请复制它以创建新的自定义标记过滤器的基础。您可以使用其可配置参数修改过滤器。

例如,以下 创建索引 API 请求使用自定义 condition 过滤器来配置新的 自定义分析器。自定义 condition 过滤器匹配流中的第一个标记。然后,它使用 reverse 过滤器反转该匹配的标记。

resp = client.indices.create(
    index="palindrome_list",
    settings={
        "analysis": {
            "analyzer": {
                "whitespace_reverse_first_token": {
                    "tokenizer": "whitespace",
                    "filter": [
                        "reverse_first_token"
                    ]
                }
            },
            "filter": {
                "reverse_first_token": {
                    "type": "condition",
                    "filter": [
                        "reverse"
                    ],
                    "script": {
                        "source": "token.getPosition() === 0"
                    }
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'palindrome_list',
  body: {
    settings: {
      analysis: {
        analyzer: {
          whitespace_reverse_first_token: {
            tokenizer: 'whitespace',
            filter: [
              'reverse_first_token'
            ]
          }
        },
        filter: {
          reverse_first_token: {
            type: 'condition',
            filter: [
              'reverse'
            ],
            script: {
              source: 'token.getPosition() === 0'
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "palindrome_list",
  settings: {
    analysis: {
      analyzer: {
        whitespace_reverse_first_token: {
          tokenizer: "whitespace",
          filter: ["reverse_first_token"],
        },
      },
      filter: {
        reverse_first_token: {
          type: "condition",
          filter: ["reverse"],
          script: {
            source: "token.getPosition() === 0",
          },
        },
      },
    },
  },
});
console.log(response);
PUT /palindrome_list
{
  "settings": {
    "analysis": {
      "analyzer": {
        "whitespace_reverse_first_token": {
          "tokenizer": "whitespace",
          "filter": [ "reverse_first_token" ]
        }
      },
      "filter": {
        "reverse_first_token": {
          "type": "condition",
          "filter": [ "reverse" ],
          "script": {
            "source": "token.getPosition() === 0"
          }
        }
      }
    }
  }
}