# 过滤器

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ops/filter.html](https://docs.oracle.com/javase/tutorial/jndi/ops/filter.html)

除了使用一组属性指定搜索外，您还可以以 _ 搜索过滤器 _ 的形式指定搜索。搜索过滤器是以逻辑表达式的形式表示的搜索查询。 [`DirContext.search（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#search-javax.naming.Name-java.lang.String-javax.naming.directory.SearchControls-) 接受的搜索过滤器的语法在 [RFC 2254](http://www.ietf.org/rfc/rfc2254.txt) 中描述。

以下搜索过滤器指定限定条目必须具有`“sn”`属性，其值为`“Geisel”`和`“mail”`属性，具有任何值：

```
(&(sn=Geisel)(mail=*))

```

以下代码创建一个过滤器和默认 [`SearchControls`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html)，并使用它们执行搜索。搜索等同于[基本搜索](basicsearch.html)示例中提供的搜索。

```
// Create the default search controls
SearchControls ctls = new SearchControls();

// Specify the search filter to match
// Ask for objects that have the attribute "sn" == "Geisel"
// and the "mail" attribute
String filter = "(&(sn=Geisel)(mail=*))";

// Search for objects using the filter
NamingEnumeration answer = ctx.search("ou=People", filter, ctls);

```

运行 [`this example`](examples/SearchWithFilterRetAll.java) 会产生以下结果。

```
# java SearchWithFilterRetAll
>>>cn=Ted Geisel
attribute: sn
value: Geisel
attribute: objectclass
value: top
value: person
value: organizationalPerson
value: inetOrgPerson
attribute: jpegphoto
value: [B@1dacd75e
attribute: mail
value: Ted.Geisel@JNDITutorial.example.com
attribute: facsimiletelephonenumber
value: +1 408 555 2329
attribute: cn
value: Ted Geisel
attribute: telephonenumber
value: +1 408 555 5252

```

## 搜索过滤器语法快速概述

搜索过滤器语法基本上是前缀表示法中的逻辑表达式（即，逻辑运算符出现在其参数之前）。下表列出了用于创建过滤器的符号。

| 符号 | 描述 |
| --- | --- |
| &安培; | 连接（即 _ 和 _ - 列表中的所有内容必须为 true） |
| &#124; | 析取（即 _ 或 _ - 一个或多个替代必须为真） |
| ！ | 否定（即 _ 而不是 _ - 被否定的项目不得为真） |
| = | 相等（根据属性的匹配规则） |
| 〜= | 近似相等（根据属性的匹配规则） |
| &GT; = | 大于（根据属性的匹配规则） |
| &LT = | 小于（根据属性的匹配规则） |
| = * | 存在（即，条目必须具有属性，但其值不相关） |
| * | 通配符（表示该位置可以出现零个或多个字符）;指定要匹配的属性值时使用 |
| \ | escape（用于在属性值中出现时转义'*'，'（'或'）'） |

过滤器中的每个项目使用属性标识符和属性值或表示属性值的符号组成。例如，项目`“sn = Geisel”`表示`“sn”`属性必须具有属性值`“Geisel”`和项目`“ mail = *“`表示必须存在`”mail“`属性。

每个项目必须括在一组括号内，如`“（sn = Geisel）”`。这些项目使用逻辑运算符组成，例如“&amp;” （连接）创建逻辑表达式，如`“（&amp;（sn = Geisel）（mail = *））”`。

每个逻辑表达式可以进一步由其他项本身是逻辑表达式组成，如`“（|（&amp;（sn = Geisel）（mail = *））（sn = L *））”`。最后一个例子是请求具有`“Geisel”`的`“sn”`属性和`“邮件”`属性或`“的条目的条目 sn“`属性以字母”L“开头。

有关语法的完整说明，请参见 [RFC 2254](http://ietf.org/rfc/rfc2254.txt) 。

前面的示例返回了与满足指定过滤器的条目关联的所有属性。您可以通过设置搜索控件参数来选择要返回的属性。您创建一个要包含在结果中的属性标识符数组，并将其传递给 [`SearchControls.setReturningAttributes（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#setReturningAttributes-java.lang.String:A-) 。这是一个例子。

```
// Specify the ids of the attributes to return
String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"};
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);

```

此示例等效于“基本搜索”部分中的[返回选定属性](basicsearch.html#SELECT)示例。运行 [`this example`](examples/SearchWithFilter.java) 会产生以下结果。 （该条目没有`“golfhandicap”`属性，因此不会返回。）

```
# java SearchWithFilter
>>>cn=Ted Geisel
attribute: sn
value: Geisel
attribute: mail
value: Ted.Geisel@JNDITutorial.example.com
attribute: telephonenumber
value: +1 408 555 5252

```