扫码阅读
手机扫码阅读

Elasticsearch(ES)的DSL语法与搜索

395 2024-07-17

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:Elasticsearch(ES)的DSL语法与搜索
文章来源:
springboot葵花宝典
扫码关注公众号
Elasticsearch DSL查询摘要

Elasticsearch DSL查询与搜索功能概述

1. DSL查询分类

Elasticsearch提供基于JSON的DSL语法来定义查询,主要包括以下类型:

  • 查询所有:返回所有文档,常用于测试。
  • 全文检索查询:通过分词器匹配词条,例如 match_querymulti_match_query
  • 精确查询:用于精确匹配关键词、数值、日期等字段,例如 termrange
  • 地理查询:基于经纬度匹配,例如 geo_distancegeo_bounding_box
  • 复合查询:组合多种查询条件,例如 boolfunction_score

2. 全文检索查询

全文检索通过分词器对用户输入内容进行分词并匹配倒排索引库,常见的使用场景包括搜索引擎、商城搜索、社交媒体等。

基本语法如下:

  • match查询:单字段匹配。
  • multi_match查询:多字段匹配。

示例:

GET /wineshop/_search
{
  "query": {
    "match": {
      "business": "公园"
    }
  }
}
    

总结:match用于单字段查询;multi_match匹配多个字段,但性能会有所下降。

3. 精确查询

精确查询不会对搜索内容进行分词,适用于keyword、数值和日期字段。常见类型包括:

  • term:精确匹配单个词条。
  • range:匹配数值或日期范围。

示例:

GET /wineshop/_search
{
  "query": {
    "term": {
      "city": {
        "value": "北京上海"
      }
    }
  }
}
    

4. 地理查询

地理查询用于根据经纬度匹配数据,常见场景包括附近酒店搜索、附近人查询等。

  • geo_bounding_box:矩形范围查询。
  • geo_distance:距离查询,基于圆形范围匹配。

示例:

GET /wineshop/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "location": "31.242201,121.509106"
    }
  }
}
    

5. 复合查询

复合查询结合多种查询条件以实现复杂逻辑,主要包括:

  • function_score:可调整相关性打分。
  • bool:通过逻辑关系组合多个子查询。

示例:使用function_score提高某品牌酒店的排名:

GET /wineshop/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": { "all": "外滩" }
      },
      "functions": [
        {
          "filter": { "term": { "brand": "七天" } },
          "weight": 2
        }
      ],
      "boost_mode": "sum"
    }
  }
}
    

总结:function_score允许自定义打分逻辑;bool查询支持must(与)、should(或)、must_not(非)、filter(过滤条件)。

6. 布尔查询

布尔查询结合多个子条件以实现复杂搜索,支持以下逻辑关系:

  • must:必须满足的条件。
  • should:可选条件。
  • must_not:必须不匹配的条件。
  • filter:过滤条件,不参与打分。

示例:

GET /wineshop/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": { "name": "如家" }}
      ],
      "must_not": [
        {"range": { "price": { "gt": 400 }}}
      ],
      "filter": [
        {"geo_distance": {
          "distance": "10km",
          "location": {
            "lat": 31.21,
            "lon": 121.5
          }
        }}
      ]
    }
  }
}
    

总结:bool查询通过逻辑关系组合条件,适合复杂搜索需求。

关注与支持:欢迎点赞、收藏和关注以获取更多内容。

想要了解更多内容?

查看原文:Elasticsearch(ES)的DSL语法与搜索
文章来源:
springboot葵花宝典
扫码关注公众号