Elasticsearch(简称 ES)是一个基于 Lucene 的搜索引擎,它提供了丰富的搜索功能,支持各种复杂的查询操作。ES 使用领域特定的语言(Domain Specific Language,DSL)来定义查询,这些查询可以通过 JSON 格式表达。本文将介绍 ES 中的常见搜索分类和相应的查询类型。
Elasticsearch DSL 查询分类
查询所有(match_all)
这种查询用于检索索引中的所有文档。由于它不应用任何过滤条件,通常用于测试或获取索引中文档的总数。
{
"query": {
"match_all": {}
}
}
全文检索查询(fulltext)
全文检索查询利用 ES 的分词器对用户的输入内容进行分词,然后在倒排索引中进行匹配。这是 ES 最常用的查询类型之一,适用于文本字段。
- match_query:用于单个字段的全文搜索。
- multi_match_query:用于在多个字段上进行全文搜索。
{
"query": {
"match": {
"fieldName": "search text"
}
}
}
精确查询
精确查询用于查找具有确切值的字段,如 keyword
类型字段、数值、日期或布尔类型字段。
- term:用于查询不进行分词的字段。
- ids:查询具有特定 ID 的文档。
- range:查询数值或日期字段在指定范围内的文档。
{
"query": {
"term": {
"fieldName": "exact value"
}
}
}
地理(geo)查询
地理查询根据地理位置信息进行搜索,适用于需要根据经纬度查找数据的场景。
- geo_distance:查询指定距离内的数据点。
- geo_bounding_box:查询地理边界框内的点。
{
"query": {
"geo_distance": {
"fieldName": {
"lat": 40.73,
"lon": -73.98,
"distance": "100km"
}
}
}
}
复合(compound)查询
复合查询将多个查询条件组合起来,允许你在查询中同时使用多个查询类型。
- bool:组合多个查询,使用逻辑运算符(如
must
,should
,must_not
)。 - function_score:根据某些函数调整查询的得分。
{
"query": {
"bool": {
"must": [
{ "term": { "status": "active" } }
],
"filter": [
{ "range": { "age": { "gte": 30 } } }
],
"should": [
{ "term": { "name": "John" } }
],
"minimum_should_match": 1
}
}
}
结论
Elasticsearch 的 DSL 查询提供了强大的搜索能力,允许开发者根据具体需求构建各种复杂的查询。从简单的全文检索到复杂的地理和复合查询,ES 的查询功能几乎可以满足所有搜索场景的需求。