在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制,它通常用于结构化数据的精确匹配,如数字范围、日期范围、布尔值、前缀匹配等。过滤器不计算相关性评分,因此比查询(Query)更快,特别是用于结构化数据的搜索。
过滤器的应用场景:
-
**数值范围过滤**:筛选特定数值范围内的文档。
-
**日期范围过滤**:根据日期筛选文档,如在特定日期范围内的事件。
-
**文本前缀过滤**:匹配以特定前缀开头的文本字段。
-
**布尔值过滤**:筛选布尔类型的字段,如筛选出所有可用状态的产品。
-
**存在性过滤**:检查特定字段是否存在于文档中。
-
**缺失值过滤**:筛选缺少特定字段的文档。
-
**脚本过滤**:使用脚本进行更复杂的筛选逻辑。
-
**字段值匹配**:筛选特定字段值的文档,如状态码或分类标签。
过滤器案例:
1. 数值范围过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gte": 50,
"lte": 200
}
}
}
}
}
}
```
此查询将返回价格在50到200之间的产品文档。
2. 日期范围过滤:
```json
GET /events/_search
{
"query": {
"bool": {
"filter": {
"range": {
"date": {
"gte": "2024-01-01",
"lt": "2024-04-01"
}
}
}
}
}
}
```
此查询将返回2024年1月1日到3月31日之间的事件文档。
3. 文本前缀过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"prefix": {
"productID": "XHDK"
}
}
}
}
}
```
此查询将返回`productID`字段以"XHDK"为前缀的产品文档。
4. 布尔值过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"term": {
"available": true
}
}
}
}
}
```
此查询将返回所有可用(`available`字段为true)的产品文档。
5. 存在性过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"exists": {
"field": "description"
}
}
}
}
}
```
此查询将返回包含`description`字段的文档。
6. 缺失值过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"bool": {
"must_not": {
"exists": {
"field": "manufacturer"
}
}
}
}
}
}
}
```
此查询将返回不包含`manufacturer`字段的文档。
7. 脚本过滤:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "doc['price'].value > 100"
}
}
}
}
}
}
```
此查询将使用脚本返回价格大于100的产品文档。
8. 字段值匹配:
```json
GET /products/_search
{
"query": {
"bool": {
"filter": {
"terms": {
"category": ["electronics", "books"]
}
}
}
}
}
```
此查询将返回分类为"electronics"或"books"的产品文档。
过滤器在Elasticsearch中非常有用,特别是当你需要对结构化数据执行快速筛选时。通过使用过滤器,你可以提高查询性能并减少不必要的计算。