ES高级使用

ES(Elasticsearch)是一种开源的分布式搜索引擎,它使用JSON格式来存储和索引数据。以下是一些高级的ES使用及语句示例:

1. 聚合查询

聚合查询是ES中非常强大的功能之一,它可以让你对文档进行分组、计算和统计等操作,以下是一个简单的聚合查询示例:

```
POST /sales/_search
{
  "size": 0,
  "aggs": {
    "group_by_country": {
      "terms": {
        "field": "country"
      }
    }
  }
}
```

该查询会按照"country"字段对文档进行分组,并返回每个分组的文档数量。

2. 全文检索

ES支持全文检索,并且提供了各种强大的查询方式,例如模糊匹配、短语匹配、通配符查询等,以下是一个简单的全文检索示例:

```
GET /_search
{
  "query": {
    "match": {
      "title": "quick brown fox"
    }
  }
}
```

该查询会在"title"字段中查找包含"quick"、"brown"和"fox"任意一个单词的文档,并按照相关性得分排序返回结果。

3. 过滤查询

ES支持各种过滤器,可以用来过滤出符合条件的文档,以下是一个简单的过滤查询示例:

```
GET /_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "brown" } },
        { "match": { "title": "fox" } }
      ],
      "filter": {
        "range": {
          "price": { "gte": 10, "lte": 20 }
        }
      }
    }
  }
}
```

该查询会在"title"字段中查找包含"brown"和"fox"两个单词的文档,并过滤出价格在10到20之间的文档。

当然有,下面再介绍一些ES的高级使用及语句示例:

4. 多字段查询

在进行全文检索时,你可能要对多个字段进行搜索,ES提供了多种方式来实现这个功能,以下是一个简单的多字段查询示例:

```
GET /_search
{
  "query": {
    "multi_match": {
      "query": "brown fox",
      "fields": ["title", "description"]
    }
  }
}
```

该查询会在"title"和"description"两个字段中查找包含"brown"或"fox"任意一个单词的文档,并按照相关性得分排序返回结果。

5. 嵌套文档查询

在ES中,你可以将一个文档嵌套到另一个文档中,这样可以方便地表示复杂的数据结构。ES也提供了各种查询方式来查询嵌套文档,以下是一个简单的嵌套文档查询示例:

```
GET /_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {
          "comments.author": "John"
        }
      }
    }
  }
}
```

该查询会在嵌套在"comments"字段中的文档中,查找"author"字段中包含"John"的文档,并返回结果。

6. 文本分析器

ES提供了多种文本分析器,可以用来将文本分成单词,并进行大小写转换、去除停用词等处理,以下是一个简单的文本分析器示例:

```
GET /_analyze
{
  "analyzer": "standard",
  "text": "Quick brown fox."
}
```

该查询会使用"standard"分析器将"Quick brown fox."这个文本分成三个词:"quick"、"brown"和"fox"。

好的,以下是另外三个ES的高级使用及语句示例:

7. 地理位置查询

ES可以处理地理位置数据,并提供了各种查询方法来查询位置数据,例如范围查询、距离排序等,以下是一个简单的地理位置查询示例:

```
GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "100km",
          "location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}
```

该查询会查找离纬度为40,经度为-70的位置在100公里半径范围内的文档,并按照距离排序返回结果。

8. 自动完成

ES提供了自动完成功能,可以根据用户输入的前缀来返回建议的文本,以下是一个简单的自动完成示例:

```
GET /_search
{
  "suggest": {
    "text": "qu",
    "completion": {
      "field": "suggest"
    }
  }
}
```

该查询会在"suggest"字段中查找以"qu"开头的建议文本,并返回与之匹配的建议结果。

9. 批量操作

如果你需要一次性对多个文档进行添加、更新或删除操作,ES提供了批量操作功能,以下是一个简单的批量操作示例:

```
POST /_bulk
{ "index" : { "_index" : "my_index", "_id" : "1" } }
{ "title" : "My first document" }
{ "index" : { "_index" : "my_index", "_id" : "2" } }
{ "title" : "My second document" }
```

该操作会批量添加两个文档到"my_index"索引中。

10.类型转换 在ES中,每个字段都有一个固定的数据类型,但是如果你需要对某个字段进行类型转换,ES也提供了这个功能,以下是一个简单的类型转换示例:

POST /my_index/_update_by_query
{
  "script": {
    "source": "ctx._source.age = Integer.parseInt(ctx._source.age)"
  },
  "query": {
    "match_all": {}
  }
}

该操作会将"my_index"索引中所有文档的"age"字段从字符串类型转换成整数类型。

11.高亮显示

ES支持高亮显示搜索结果中匹配的字段

GET /my_index/_search
{
  "query": {
    "match": {
      "description": "shopping"
    }
  },
  "highlight": {
    "fields": {
      "description": {}
    }
  }
}

该查询会在"my_index"索引中查找所有包含"shopping"关键词的文档,并将匹配的关键词在"description"字段中进行高亮显示。

12.自定义评分函数

ES的评分功能非常强大,但有时候需要对评分逻辑进行定制,ES也提供了自定义评分函数的功能,以下是一个简单的自定义评分函数示例:

GET /my_index/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "description": "shopping"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "return doc['price'].value * params.factor",
              "params": {
                "factor": 1.5
              }
            }
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}

该查询会在"my_index"索引中查找所有包含"shopping"关键词的文档,并根据每个文档的"price"字段计算评分值,然后将所有评分值求和并乘以一个因子来得到最终的评分值。

13. 聚合查询

除了前面提到的聚合查询,ES还支持更多类型的聚合查询,例如范围聚合、日期直方图聚合等,以下是一个简单的日期直方图聚合示例:

```
GET /my_index/_search
{
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}
```

该查询会按天对"timestamp"字段进行聚合,并计算每天的"price"字段的总和。

14. 模板查询

如果你需要执行一些复杂的查询操作,可以使用ES的模板查询功能,这样可以将查询逻辑封装成一个模板,然后在需要时进行调用,以下是一个简单的模板查询示例:

```
PUT _scripts/my_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "{ {field}}": "{ {value}}"
        }
      }
    }
  }
}

POST /my_index/_search/template
{
  "id": "my_template",
  "params": {
    "field": "description",
    "value": "shopping"
  }
}
```

该操作会创建一个名为"my_template"的模板,并使用它在"description"字段中查找包含"shopping"关键词的文档。

15. 自定义分析器

如果ES提供的标准分析器无法满足你的需求,可以使用自定义分析器来进行文本分析,以下是一个简单的自定义分析器示例:

```
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_filter"
          ]
        }
      },
      "filter": {
        "my_filter": {
          "type": "stop",
          "stopwords": [
            "and",
            "the",
            "a"
          ]
        }
      }
    }
  }
}
```

该操作会创建一个名为"my_analyzer"的自定义分析器,它会使用"standard"分词器和自定义的"my_filter"过滤器来处理文本。

这些都是ES的高级使用及语句示例,ES还有很多其他强大的功能和语句可以使用,需要根据具体需求进行学习和使用。

猜你喜欢

转载自blog.csdn.net/qq_46020806/article/details/130786181
今日推荐