ElasticSearch高阶使用

这篇具有很好参考价值的文章主要介绍了ElasticSearch高阶使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、match_all

二、 text和keyword的区别

三、match、term的区别

四、exists query

五、 ids query

六、range query范围查询

七、prefix query前缀查询

八、 wildcard query通配符查询

九、 fuzzy query模糊查询

十、match query匹配查询

十一、multi_match query 多字段查询

十二、match_phrase query短语查询

十三、query_string query

十四、simple_query_string query

十五、bool query布尔查询


一、match_all

#使用match_all,匹配所有文档,默认只会返回10条数据。
#原因:_search查询默认采用的是分页查询,每页记录数size的默认值为10。如果想显示更多数据,指定size
GET /es_db/_search
{
  "query":{
    # 使用match_all,匹配所有文档,默认只会返回10条数据。
    # 原因:_search查询默认采用的是分页查询,每页记录数size的默认值为10。如果想显示更多数据,指定size
    "match_all":{}
  }
   
  # _source 关键字: 是一个数组,在数组中用来指定展示那些字段
  "_source": ["name","address"]
  # 不查看源数据,仅查看元字段
  # "_source": false,
  # 只看以obj.开头的字段
  #  "_source": "obj.*",
   
  # size 关键字: 指定查询结果中返回指定条数。 默认返回值10条
  "size": 100
   
  # from 关键字用来指定起始返回位置,和size关键字连用可实现分页效果,默认是 0
  "from": 0,
   
  # 指定字段排序sort,会让得分失效
  "sort": [
    {
      "age": "desc"
    }
  ]
}

二、 text和keyword的区别

  1.   text类型字段在存储时会分词建立索引,keywaord不会。也就是说text支持模糊查询。keyword只能用于精准查询
  2.   text类型不支持聚合、排序等操作,因为它是被拆分成单个词项存储的,而keyword可以

三、match、term的区别

  1. match在查询时会将查询条件先分词,分词列表中的任何一个值匹配到记录都会返回相应结果
  2. match_phrase是短语查询,如果记录中有字段完全包含这个短语则会有查询结果
  3. term在查询时不会将查询条件分词,而是直接以源查询条件去匹配,如果匹配到记录则返回相应结果。并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。
    可以通过 Constant Score 将查询转换成一个 Filtering,避免算分,并利用缓存,提高性能。term处理多值字段时,term查询是包含,不是等于。
GET /es_db/_search
{
   "query": {
      "constant_score": {
         "filter": {
            "term": {
                "address.keyword": "广州白云山公园"
            }
         }
       }
    }
}

 注意:最好不要在term查询的字段中使用text字段,因为text字段会被分词,这样做既没有意义,还很有可能什么也查不到。

四、exists query

在Elasticsearch中可以使用exists进行查询,以判断文档中是否存在对应的字段

GET / es_db / _search {
    "query": {
        "exists": {
            "field": "remark"
        }
    }
}

五、 ids query

ids 关键字 : 值为数组类型,用来根据一组id获取多个对应的文档

GET /es_db/_search
{
    "query": {
        "ids": {
            "values": [1, 2]
        }
    }
}

六、range query范围查询

range:范围关键字

  • gte 大于等于
  • lte 小于等于
  • gt 大于
  • lt 小于
  • now 当前时间
POST /es_db/_search
{
    "query": {
        "range": {
            "age": {
                "gte": 25,
                "lte": 28
            }
        }
    }
}
 
 
 
GET /product/_search
{
    "query": {
        "range": {
            "date": {
                "gte": "now-2y"
            }
        }
    }
}

七、prefix query前缀查询

  • 它会对分词后的term进行前缀搜索。
  • 它不会分析要搜索字符串,传入的前缀就是想要查找的前缀
  • 默认状态下,前缀查询不做相关度分数计算,它只是将所有匹配的文档返回,然后赋予所有相关分数值为1。
  • 它的行为更像是一个过滤器而不是查询。两者实际的区别就是过滤器是可以被缓存的,而前缀查询不行。
  • prefix的原理:需要遍历所有倒排索引,并比较每个term是否以所指定的前缀开头。
GET /es_db/_search
{
    "query": {
        "prefix": {
            "address": {
                "value": "广州"
            }
        }
    }
}

八、 wildcard query通配符查询

通配符查询:工作原理和prefix相同,只不过它不是只比较开头,它能支持更为复杂的匹配模式。

GET /es_db/_search
{
    "query": {
        "wildcard": {
            "address": {
                "value": "*白*"
            }
        }
    }
}

九、 fuzzy query模糊查询

在实际的搜索中,我们有时候会打错字,从而导致搜索不到。在Elasticsearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。

fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length

fuzziness:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段

操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1;如中文集团到中威集团编辑距离就是1,只需要修改一个字符;如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也查出来。
该参数默认值为0,即不开启模糊查询; fuzzy 模糊查询 最大模糊错误必须在0-2之间
prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配;如这里等于1,则表示开头的字必须匹配,不匹配则不返回;默认值也是0;

加大prefix_length的值可以提高效率和准确率。

GET /es_db /_search
{
    "query": {
        "fuzzy": {
            "address": {
                "value": "白运山",
                "fuzziness": 1
            }
        }
    }
}

十、match query匹配查询

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找。

match支持以下参数:

  • query : 指定匹配的值
  • operator : 匹配条件类型
  • and : 条件分词后都要匹配
  • or : 条件分词后有一个匹配即可(默认)
  • minmum_should_match : 最低匹配度,即条件在倒排索引中最低的匹配度
#match 分词后or的效果
GET /es_db/_search
{
  "query": {
      "match": {
        "address": "广州白云山公园"
      }
  }
}
 
# 分词后 and的效果
GET /es_db/_search
{
  "query": {
    "match": {
      "address": {
        "query": "广州白云山公园",
        "operator": "and"
      }
    }
  }
}

在match中的应用: 当operator参数设置为or时,minnum_should_match参数用来控制匹配的分词的最少数量。

# 最少匹配广州,公园两个词
GET /es_db/_search
{
  "query": {
    "match": {
      "address": {
        "query": "广州公园",
        "minimum_should_match": 2
      }
    }
  }
}

对于match查询,其底层逻辑的概述:

  1. 分词:首先,输入的查询文本会被分词器进行分词。分词器会将文本拆分成一个个词项(terms),如单词、短语或特定字符。分词器通常根据特定的语言规则和配置进行操作。
  2. 倒排索引:ES使用倒排索引来加速搜索过程。倒排索引是一种数据结构,它将词项映射到包含这些词项的文档。每个词项都有一个对应的倒排列表,其中包含了包含该词项的所有文档的引用。
  3. 匹配计算:一旦查询被分词,ES将根据查询的类型和参数计算文档与查询的匹配度。对于match查询,ES将比较查询的词项与倒排索引中的词项,并计算文档的相关性得分。相关性得分衡量了文档与查询的匹配程度。
  4. 结果返回:根据相关性得分,ES将返回最匹配的文档作为搜索结果。搜索结果通常按照相关性得分进行排序,以便最相关的文档排在前面。

十一、multi_match query 多字段查询

多字段查询,可以根据字段类型,决定是否使用分词查询,得分最高的在前面

GET /es_db/_search
{
  "query": {
    "multi_match": {
      "query": "长沙张龙",
      "fields": [
        "address",
        "name"
      ]
    }
  }
}

 注意:字段类型分词,将查询条件分词之后进行查询,如果该字段不分词就会将查询条件作为整体进行查询。

十二、match_phrase query短语查询

        短语搜索(match phrase)会对搜索文本进行文本分析,然后到索引中寻找搜索的每个分词并要求分词相邻,你可以通过调整slop参数设置分词出现的最大间隔距离。match_phrase 会将检索关键词分词。可以借助slop参数,slop参数告诉match_phrase查询词条能够相隔多远(位置偏移量,不是隔多少个分词)时仍然将文档视为匹配。

GET /es_db/_search
{
  "query": {
    "match_phrase": {
      "address": {
        "query": "广州云山",
        "slop": 2
      }
    }
  }
}

十三、query_string query

      允许我们在单个查询字符串中指定AND | OR | NOT条件,同时也和 multi_match query 一样,支持多字段搜索。和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。

注意: 查询字段分词就将查询条件分词查询,查询字段不分词将查询条件不分词查询

# 未指定字段查询
 
# AND 要求大写
GET /es_db/_search
{
  "query": {
    "query_string": {
      "query": "赵六 AND 橘子洲"
    }
  }
}
 
# 指定单个字段查询
#Query String
GET /es_db/_search
{
  "query": {
    "query_string": {
       "default_field": "address",
       "query": "白云山 OR 橘子洲"
    }
  }
}
 
# 指定多个字段查询
GET /es_db/_search
{
  "query": {
    "query_string": {
       "fields": ["name","address"],
       "query": "张三 OR (广州 AND 王五)"
    }
  }
}

十四、simple_query_string query

类似Query String,但是会忽略错误的语法,同时只支持部分查询语法,不支持AND OR NOT,会当作字符串处理。支持部分逻辑:

  • + 替代AND
  • | 替代OR
  • - 替代NOT
GET /es_db/_search
{
    "query": {
        "simple_query_string": {
            "fields": ["name", "address"],
            "query": "广州公园",
            "default_operator": "AND"
        }
    }
}
 
 GET /es_db/_search
{
    "query": {
        "simple_query_string": {
            "fields": ["name", "address"],
            "query": "广州 + 公园"
        }
    }
}

十五、bool query布尔查询

布尔查询可以按照布尔逻辑条件组织多条查询语句,只有符合整个布尔条件的文档才会被搜索出来。
在布尔条件中,可以包含两种不同的上下文。
1. 搜索上下文(query context):使用搜索上下文时,Elasticsearch需要计算每个文档与搜索条件的相关度得分,这个得分的计算需使用一套复杂的计算公式,有一定的性能开销,带文本分析的全文检索的查询语句很适合放在搜索上下文中。
2. 过滤上下文(filter context):使用过滤上下文时,Elasticsearch只需要判断搜索条件跟文档数据是否匹配,例如使用Term query判断一个值是否跟搜索内容一致,使用Range query判断某数据是否位于某个区间等。过滤上下文的查询不需要进行相关度得分计算,还可以使用缓存加快响应速度,很多术语级查询语句都适合放在过滤上下文中。

布尔查询一共支持4种组合类型:

类型 说明

filter

可包含多个过滤条件,每个条件均满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文

must

可包含多个查询条件,每个条件均满足的文档才能被搜索到,每次查询需要计算相关度得分,属于搜索上下文

must_not

可包含多个过滤条件,每个条件均不满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文

should

可包含多个查询条件,不存在must和fiter条件时,至少要满足多个查询条件中的一个,文档才能被搜索到,否则需满足的条件数量不受限制,匹配到的查询越多相关度越高,也属于搜索上下文文章来源地址https://www.toymoban.com/news/detail-812937.html

GET /books/_search
{
    "query ": {
       "bool": {
          "must": [
          {
            "match": {
              title ": "java编程"
            }
          }, {
            "match": {
              "description": "性能优化"
            }
          }
          ]
       }
    }
}
 
 
GET /books/_search
{
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "title": "java编程"
                }
            }, {
                "match": {
                    "description": "性能优化"
                }
            }],
            "minimum_should_match": 1
        }
    }
}
 
 
GET /books/_search
{
    "query": {
        "bool": {
            "filter": [{
                    "term": {
                        "language": "java"
                    }
                },
                {
                    "range": {
                        "publish_time": {
                            "gte": "2010-08-01"
                        }
                    }
                }
            ]
        }
    }
}

到了这里,关于ElasticSearch高阶使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch搜索引擎:数据的写入流程

    (1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node  (2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上 shard = hash(document_id) %

    2023年04月14日
    浏览(68)
  • SpringBoot 使用 Elasticsearch 搜索引擎

    作者:禅与计算机程序设计艺术 Spring Boot 是由 Pivotal 团队提供的一套用于开发基于 Spring 框架的应用的工具包。其主要目标是通过提供简单易用的starter包来简化开发流程。Spring Boot 极大的地方在于其依赖自动配置,可以很好的满足开发人员的开发需求。Spring Boot 提供了数据访

    2024年02月09日
    浏览(49)
  • 全文搜索引擎 Elasticsearch 入门使用

    目录 1、安装 2、基本概念 2.1 Node 与 Cluster 2.2 Index 2.3 Document  2.4 Type 3、新建和删除 Index 4、中文分词设置  5、数据操作  5.1 新增记录  5.2 查看记录   5.3 删除记录 5.4 更新记录  6、数据查询 6.1 返回所有记录 6.2 全文搜索  6.3 逻辑运算 7、参考链接 本文从零开始,讲解如何

    2024年02月09日
    浏览(44)
  • 提升搜索引擎效率:使用 Elasticsearch 别名

    ​ ​Elasticsearch 因其强大的搜索能力而备受推崇,使其成为构建高性能搜索引擎的热门选择。其中一个关键特性是使用别名,Elasticsearch 的别名为优化搜索操作、提升查询性能以及启用动态索引管理提供了强大的机制。 在本文中,我们将探讨如何使用别名在 Elasticsearch 中创建

    2024年02月11日
    浏览(52)
  • 搜索引擎(大数据检索)论述[elasticsearch原理相关]

    首先需要大致知道搜索引擎有大致几类:1.全文搜索引擎 2.垂直搜索引擎 3.类目搜索引擎等。 1.全文搜索引擎:是全文本覆盖的,百度,google等都是全文本搜索,就是我搜一个词项“方圆”,那么这个词项可以是数字平方的概念,可以是一个人名,可以是一首歌等,所有的相

    2023年04月08日
    浏览(56)
  • 使用Elasticsearch构建强大的搜索和分析引擎

    Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,被广泛用于处理大规模的文本数据。无论是构建全文搜索引擎、进行日志分析还是实现实时数据可视化,Elasticsearch都是一个强大而灵活的工具。本文将带您逐步了解如何使用Elasticsearch,并构建您自己的搜索和分析应用。

    2024年02月04日
    浏览(57)
  • ELK之从Logstash读取数据到Elasticsearch

    前置条件: Elasticsearch 集群正常 Elasticsearch集群配置直通车:ELK之Elasticsearch7.17.4安装(yum方式)和三节点集群配置 Filebeat和logstash打通 ELK之LogStash接收Filebeat的数据:ELK之LogStash接收Filebeat的数据 修改Logstash 配置文件,将output改为如下地址,注释掉控制台输出,添加elasticsearc

    2024年01月22日
    浏览(47)
  • 基于Elasticsearch与Hbase组合框架的大数据搜索引擎

    本项目为学校大数据工程实训项目,共开发4周,答辩成绩不错。代码仓库放文章尾,写的不好,代码仅供参考。 对于结构化数据 ,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的二维表(Table)的方式存储和搜索,也可以建立索引。

    2024年02月09日
    浏览(65)
  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一个基于 Lucene 的 搜索服务器 ,它提供了一个 分布式多用户 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎,设计用于云计算中,能够达到 实时搜索 , 稳定 , 可靠

    2024年02月11日
    浏览(58)
  • Elasticsearch (ES) 搜索引擎: 数据类型、动态映射、多类型(子字段)

    原文链接:https://xiets.blog.csdn.net/article/details/132348634 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 映射字段的 数据类型 ,官网文档参考:Field data types。 下面是 ES 常用的一些基本数据类型。 字符串 类型: keyword :类型。 text :文本类型。

    2024年03月23日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包