• ES 查询语法-详解


    1.DSL查询文档

    elasticsearch的查询依然是基于JSON风格的DSL来实现的。

    1.1.DSL查询分类

    Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:

    • 查询所有:查询出所有数据,一般测试用。例如:match_all

    • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

      • match_query
      • multi_match_query
    • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

      • ids
      • range
      • term
        查询的语法基本一致:
    GET /indexName/_search
    {
      "query": {
        "查询类型": {
          "查询条件": "条件值"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们以查询所有为例,其中:

    • 查询类型为match_all
    • 没有查询条件
    // 查询所有
    GET /indexName/_search
    {
      "query": {
        "match_all": {
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其它查询无非就是查询类型查询条件的变化。

    1.2.全文检索查询

    1.2.1.使用场景

    全文检索查询的基本流程如下:

    • 对用户搜索的内容做分词,得到词条
    • 根据词条去倒排索引库中匹配,得到文档id
    • 根据文档id找到文档,返回给用户

    比较常用的场景包括:

    • 商城的输入框搜索
    • 百度输入框搜索

    例如京东:

    在这里插入图片描述

    因为是拿着词条去匹配,因此参与搜索的字段也必须是可分词的text类型的字段。

    1.2.2.基本语法

    常见的全文检索查询包括:

    • match查询:单字段查询
    • multi_match查询:多字段查询,任意一个字段符合条件就算符合查询条件

    match查询语法如下:

    GET /indexName/_search
    {
      "query": {
        "match": {
          "FIELD": "TEXT"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    mulit_match语法如下:

    GET /indexName/_search
    {
      "query": {
        "multi_match": {
          "query": "TEXT",
          "fields": ["FIELD1", " FIELD12"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.2.3.总结

    match和multi_match的区别是什么?

    • match:根据一个字段查询
    • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差

    1.3.精准查询

    精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

    • term:根据词条精确值查询
    • range:根据值的范围查询

    1.3.1.term查询

    因为精确查询的字段搜是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。

    语法说明:

    // term查询
    GET /indexName/_search
    {
      "query": {
        "term": {
          "FIELD": {
            "value": "VALUE"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例:

    当我搜索的是精确词条时,能正确查询出结果:
    在这里插入图片描述
    基本语法:

    // range查询
    GET /indexName/_search
    {
      "query": {
        "range": {
          "FIELD": {
            "gte": 10, // 这里的gte代表大于等于,gt则代表大于
            "lte": 20 // lte代表小于等于,lt则代表小于
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.3.2.总结

    精确查询常见的有哪些?

    • term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
    • range查询:根据数值范围查询,可以是数值、日期的范围
  • 相关阅读:
    基于PHP+MySQL青年志愿者服务管理系统的设计与实现
    Web安全——信息收集上篇
    关于#SP#的问题,如何解决?(关键词-上拉)
    Spring之IoC(容器配置、Spring坐标导入、获取bean)
    分类分析|KNN分类模型及其Python实现
    Redis实现分布式锁
    【交通建模】基于模型的自主交通仿真框架附matlab代码
    关于 MyBatis,10 种通用的写法分享
    Spring 如何实现一个CGLlB动态代理呢?
    Java:ArrayList源码解析
  • 原文地址:https://blog.csdn.net/qq_39017153/article/details/134524466