• ElasticSearch-查询语法(全文查询)


    ElasticSearch-查询语法(全文查询)

    • 7之前查询时候是: 索引/文档类型/文档id (索引是库,文档类型是表,文档id对应行)
    • 7的时候: 索引/_doc/文档id ( 索引是表,_doc是默认文档类型,文档id对应行) _doc只是用于到8的过度
    • 8+的时候: 索引/文档id (索引是表,文档id对应行) 到8之后_doc就被彻底取消了

    es 全文查询主要用在文本字段上,主要考虑查询语句与文档的相关性(Relevance)。

    match

    match query 用于搜索单个字段,首先会针对查询语句进行解析(经过 analyzer),主要是对查询语句进行分词,分词后查询语句的任何一个词项被匹配,文档就会被搜到,默认情况下相当于对分词后词项进行 or 匹配操作。

    GET article/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "Elasticsearch 查询优化"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    等同于 or 匹配操作,如下:

    GET article/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "Elasticsearch 查询优化",
            "operator": "or"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果想查询匹配所有关键词的文档,可以用 and 操作符连接,如下:

    GET article/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "Elasticsearch 查询优化",
            "operator": "and"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    match_phrase

    match_phrase query 首先会把 query 内容分词,分词器可以自定义,同时文档还要满足以下两个条件才会被搜索到:

    1. 分词后所有词项都要出现在该字段中(相当于 and 操作)。
    2. 字段中的词项顺序要一致。

    例如,有以下 3 个文档,使用 match_phrase 查询只有前两个文档会被匹配:

    PUT test_idx/test_tp/1
    { "desc": "what a wonderful life" }
    
    PUT test_idx/test_tp/2
    { "desc": "what a life"}
    
    PUT test_idx/test_tp/3
    { "desc": "life is what"}
    
    GET test_idx/test_tp/_search
    {
      "query": {
        "match_phrase": {
          "desc": "what life"
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    match_phrase_prefix

    match_phrase_prefix 和 match_phrase 类似,只不过 match_phrase_prefix 支持最后一个词进行前缀匹配。

    GET test_idx/test_tp/_search
    {
      "query": {
        "match_phrase_prefix": {
          "desc": "what li"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    multi_match

    multi_match 是 match 的升级,用于搜索多个字段。查询语句为“java 编程”,查询域为 title 和 description,查询语句如下:

    GET books/_search
    {
      "query": {
        "multi_match": {
          "query": "java 编程",
          "fields": ["title", "description"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    multi_match 支持对要搜索的字段的名称使用通配符,示例如下:

    GET books/_search
    {
      "query": {
        "multi_match": {
          "query": "java 编程",
          "fields": ["title", "*_name"]
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    同时,也可以用指数符号指定搜索字段的权重。指定关键词出现在 title 中的权重是出现在 description 字段中的 3 倍,命令如下:

    GET books/_search
    {
      "query": {
        "multi_match": {
          "query": "java 编程",
          "fields": ["title^3", "description"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    query_string

    query_string query 是与 Lucene 查询语句的语法结合非常紧密的一种查询,允许在一个查询语句中使用多个特殊条件关键字(如:AND | OR | NOT)对多个字段进行查询

    运算符

    “default_operator”:“运算符” 有AND、OR,默认为OR。 比如query里面的内容是 ”搜索服务器”,那么只要分词集中包含之一就可以匹配。

    如果"default_operator":“AND”, 那么就是全匹配 比如: query里面的内容是 ”搜索服务器” 那么只要分词集内词能拼出 ”搜索服务器” 这整句话就可以匹配

    通配符

    支持一些简单的wildcard写法。比如fields:["nam*"]`即任何nam开头的字段

    * , 可以代替一个任意字符、 *可代表任意个字符(包括零个)

    比如你要查询的内容很长,记不清了但是你记得末尾是tor,那么你只需要把query内容写成*tor即可

    正则

    如果要在query的内容中使用正则表达式,在两端加上正斜杠/即可。比如: name:/ob[am]{2}a/

    GET /testindex/_search
    {
        "query":{
            "query_string":{
                "default_field":"title",
                "query":"搜索服务器"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    点赞 -收藏-关注-便于以后复习和收到最新内容
    有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
    在本博客学习的技术不得以任何方式直接或者间接的从事违反中华人民共和国法律,内容仅供学习、交流与参考
    免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我、以迅速采取适当措施,避免给双方造成不必要的经济损失。
    感谢,配合,希望我的努力对你有帮助^_^
  • 相关阅读:
    vue3中使用 tui-image-editor进行图片处理,并上传
    基于改进粒子群算法的微电网多目标优化调度(Matlab代码实现)
    【无标题】
    前端开发各种loading效果【loading图的顺序对应代码顺序】
    【Python】python -m pip install 和 pip install 的区别
    左连接(Left Join)、右连接(Right Join)、内连接(Inner Join)和等值连接
    振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例
    SpringBoot线上服务假死解决,CPU内存正常
    【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。
    MySQL备份与恢复
  • 原文地址:https://blog.csdn.net/weixin_45203607/article/details/127753091