ElasticSearch - Query DSL 查询语言

一、相关概念

  •     1、DSL 介绍

        Elasticsearch 提供了一个完整的基于 JSON 的查询 DSL(Domain Specific Language)来定义查询

        参考:Query DSL | Elasticsearch Guide [8.0] | Elastic

        一个查询语句可由叶子查询子句(Leaf Query Clauses)和 复合查询子句(Compound Query Clauses)两部分构成

  •         叶子查询字句

            在指定的字段上查询指定的值,如 match、term、range 等,子句可以单独使用

  •         复合查询字句

            包装其他叶子查询或复合查询为一个查询,并用于以逻辑方式组合多个查询或改变它们的行为

  •     2、Context 介绍

        Elasticsearch查询子句的行为,取决于它们是在查询上下文(Query Context)中还是在过滤上下文(Filter Context)中运行

        参考:Query and filter context | Elasticsearch Guide [8.0] | Elastic

            查询上下文

                在查询上下文中,查询子句回答 “这个文档有多匹配这个查询?”。除了决定文档是否匹配,字句匹配的文档还会计算一个字句评分,来评定文档有多匹配。查询上下文由 query 元素表示

            过滤上下文

                在过滤上下文中,过滤子句回答 “这个文档是否匹配这个查询?”。过滤上下文主要用于过滤结构化数据,不参与相关性评分,但被频繁使用的Filter将被缓存以提高查询性能。过滤上下文由 例如 bool 查询中的 filter 或 must_not 表示

二、字段查询

    字段类查询主要包括两类:单词匹配(Term Level Query)和全文匹配(Full Text Query)

        单词匹配

            不对查询语句进行分词处理,直接匹配该字段的倒排索引;包括 term、terms、range 等查询语句

        全文匹配

            对查询语句进行分词处理候再去匹配已分词的文本字段。包括 match、match_phrase、query_string 查询语句

  •     1、单词匹配

        term 

            根据精确的值(比如ID、UserName)来检索文档;不会对查询条件做分词处理;如果检索字段会分词且查询条件可分词时则查询不到结果

  GET /goods/_search
{
    "query": {
        "term": {
            "name": "苹果"
        }
    }
}

        terms 

            terms和term 有点类似,但 terms 允许指定多个匹配条件

  GET /goods/_search
{
    "query": {
        "terms": {
            "name": [ "苹果", "华为" ]
        }
    }
}

        range

            范围查询主要用于date或number类型的字段查询。gt :大于;gte : 大于等于;lt :小于;lte : 小于等于

  GET /goods/_search
{
    "query": {
        "range": {
            "price": {
                "gte": 5000,
                "lte": 9000
            }
        }
    }
}

       exists 

            查询指定字段值不为空的文档

  GET /goods/_search
{
    "query": {
        "exists" : { "field" : "gift" }
    }
}

        fuzzy 

            查询与指定字段值与搜索词类似(由Levenshtein编辑距离度量)的词的文档

  GET /goods/_search
{
    "query": {
        "fuzzy": {
            "keywords": {
                // 搜索 wetch 可将 watch 返回
                "value": "wetch"
            }
        }
    }
}

        wildcard

            查询与指定字段值与与通配符相匹配的词的文档

            注意分词模式,对分词字段是正对分词后的词组进行匹配

            应劲量避免使用通配符最为前缀,否则会增加匹配的迭代次数并降低搜索的性能

            支持的通配符运算符:

                ? :它与任何单个字符匹配

                * :可以匹配零个或多个字符

  GET /goods/_search
{
    "query": {
        "wildcard": {
            "goodsName": {
                // 前后不固定长度和字符的匹配
                "value": "*淇*"
            }
        }
    }
}

        regexp

            查询与指定字段值与正则表达式相匹配的词的文档

            注意分词模式,对分词字段是正对分词后的词组进行匹配

            支持以下标准运算符:

                . :匹配任何字符

                ? :重复前面的字符零或一遍

                + :重复前面的字符一次或多次

                * :重复前面的字符零次或多次

                {} :前一个字符可以重复的最小和最大次数

                | :或运算符,如果左侧或右侧的最长模式匹配,则匹配成功

                ( … ) :构建一个小组,可以使用组将表达式的一部分视为单个字符

                [ … ] :匹配括号中的一个字符

  GET /goods/_search
{
    "query": {
        "regexp": {
            "goodsName": {
                // 前后不固定长度和字符的匹配
                "value": ".*果.*"
            }
        }
    }
}
  •     2、全文匹配

        match 

            用于执行全文检索的字段类查询的基础查询

GET /goods/_search
{
  "query": {
    "match": {
      "name": "苹果手机"
    }
  }
}

        match_phrase

            用于对短语进行全文检索,可以设置短语单词间允许的间隔个数,默认无间隔

GET /goods/_search
{
  "query": {
    "match_phrase": {
      "name": "苹果公司"
    }
  }
}
---------------------------------------
GET /goods/_search
{
  "query": {
    "match_phrase": {
      "name": {
        "query": "苹果公司",
      "slop":5
      }    
    }
  }
}

        multi_match

            用于多字段进行全文检索,其中一个字段满足即可被检索

GET /goods/_search
{
  "query": {
    "multi_match": {
        "query" : "苹果",
        "fields" : ["name", "content"]
    }
  }
}

        query_string

            用于构建复杂的全文检索,包括通配符、跨字段等的搜索

GET /goods/_search
{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "苹果 or Apple"
      }
    }
  }
--------------------------------  
GET /goods/_search
{
  "query": {
    "query_string": {
      "fields": ["name","content"],
      "query": "苹果 or Apple"
      }
    }
  }

三、复合查询

    包括 bool query、boosting query、constant_score query、dis_max query、funcation_score query 等

  •     1、Bool query

        Bool Query 是检索与多个查询经过布尔逻辑后相匹配的文档的查询,由一个或多个 bool 子句构成的

关键字 描述
must 返回的结果文档必须完全匹配子句的查询条件,并将对分数产生影响
filter 返回的结果文档必须完全匹配子句的查询条件,在Filter上下文中执行,不对分数产生影响
should 返回的结果文档最好匹配子句的查询条件,对分数产生影响
must_not 返回的结果文档必须不匹配子句的查询条件,在Filter上下文中执行,不对分数产生影响

        must、must_not 语句里面如果包含多个条件,则各个条件间是 且 的关系,而 should 的多个条件是 或 的关系

        查询语句同时包含 must 和 should 时,可以不满足 should 的条件;只包含 should 时必须满足 

GET /goods/_search
{
  "query": {
    "bool": {
        "must": [
          {
            "match": {
              "name": "苹果"
            }
          }
        ],
        "should": [
          {
            "term": {
              "price": 8999
            }
          }
        ]
    }
  }
}

你可能感兴趣的:(ElasticSearch,elasticsearch,搜索引擎,大数据)