es 查询案例分析

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

场景描述:

有这样一种场景,比如我们想搜索

title:Brown fox

body:Brown fox

文章索引中有两条数据,兔子和狐狸两条数据

PUT /blogs/_bulk
{"index": {"_id": 1}}
{"title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen."}
{"index": {"_id": 2}}
{"title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis."}

结果肯定是想要数据二,狐狸优先展示

但是,然后搜索的时候,会对搜素词 Brown fox 进行分词,导致数据一优先级更高

可以看下结果:
优先展示的是兔子,有 0.8 的算分,而狐狸只有 0.7 的算分

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "title": "Brown fox"
        }},
        {"match": {
          "body": "Brown fox"
        }}
      ]
    }
  }
}

原因分析:

bool should的算法过程:

  • 查询should语句中的两个查询
  • 加和两个查询的评分
  • 乘以匹配语句的总数
  • 除以所有语句的总数

上述例子中,title和body属于竞争关系,不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分。

解决方案

方式一 dis_max:

可以采用 dis max query

实例如下:可以看到此时达到了我们想要的结果

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match":{
        "title": "Brown fox"
        }
        }, 
        {
          "match": {
          "body": "Brown fox"
        }
        }
      ]
    }
  }
}

这里简单解释一下这两种命令产生的原因:

类似 MySQL 可以使用 explain 关键字分析指令

先分析 bool should

如下看兔子这条数据,总算分是两个字段的算分之和

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "explain": true, 
  "query": {
    "bool": {
      "should": [
        {"match": {
          "title": "Brown fox"
        }},
        {"match": {
          "body": "Brown fox"
        }}
      ]
    }
  }
}

再来看 dis_max

如下同样看兔子的这条数据,可以看到,此时这条数据的总算分是其中一个字段的最大值

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "explain": true, 
  "query": {
    "dis_max": {
      "queries": [
        {
          "match":{
        "title": "Brown fox"
        }
        }, 
        {
          "match": {
          "body": "Brown fox"
        }
        }
      ]
    }
  }
}

dis_max 还可以使用 tie_breaker 控制非最大值字段的算分

tier breaker是一个介于0-1之间的浮点数。0代表使用最佳匹配;1代表所有语句同等重要。

  1. 获得最佳匹配语句的评分_score 。
  2. 将其他匹配语句的评分与tie_breaker相乘
  3. 对以上评分求和并规范化

最终得分=最佳匹配字段+其他匹配字段*tie_breaker

此时可以看到

兔子这条数据的算分 0.714258 = 0.6931471 + 0.21110919 * 0.1

0.1 就是 tier breaker 的数值

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

方式二 multi_mahch :

还记得之前篇章里面学到的 multi_match 多字段查询么

看到下面结果中的算分是不是有点似曾相识,

没错,multi_mahch 默认的查询方式就是两字段取最大值的方式

算分方式和上面一致,可以自行使用 explain 进行尝试

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "query": "Brown fox",
      "fields": ["title","body"]
    }
  }
}

同样的 multi_mahch 也可以使用 tie_breaker 控制最佳匹配之外字段的算分

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "type": "best_fields", 
      "query": "Brown fox",
      "fields": ["title","body"],
      "tie_breaker": 0.1
    }
  }
}

multi_mahch 有三种方式

best_fields

这种方式就是默认的方式,就不再演示了

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "type": "best_fields", 
      "query": "Brown fox",
      "fields": ["title","body"]
    }
  }
}

most_fields

这种方式就是上面 bool should 求和的方式

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "type": "most_fields", 
      "query": "Brown fox",
      "fields": ["title","body"]
    }
  }
}

cross_fields

跨字段查询

搜索内容在多个字段中都显示,类似 bool+dis_max 组合

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

PUT /address/_bulk
{ "index": { "_id": "1"} }
{"province": "湖南","city": "长沙"}
{ "index": { "_id": "2"} }
{"province": "湖南","city": "常德"}
{ "index": { "_id": "3"} }
{"province": "广东","city": "广州"}
{ "index": { "_id": "4"} }
{"province": "湖南","city": "邵阳"}




# 可以使用cross_fields,支持operator
#与copy_to相比,其中一个优势就是它可以在搜索时为单个字段提升权重。
GET /address/_search
{
  "query": {
    "multi_match": {
      "query": "湖南常德",
      "type": "cross_fields",
      "operator": "and", 
      "fields": ["province","city"]
    }
  }
}

这里跨字段还有另一种方式:

可以用copy...to 解决,但是需要额外的存储空间

es 查询案例分析,elasticsearch,es,搜索引擎,大数据,es 案例分析

DELETE /address
# copy_to参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询
PUT /address
{
  "mappings" : {
      "properties" : {
        "province" : {
          "type" : "keyword",
          "copy_to": "full_address"
        },
        "city" : {
          "type" : "text",
          "copy_to": "full_address"
        }
      }
    },
    "settings" : {
        "index" : {
            "analysis.analyzer.default.type": "ik_max_word"
        }
    }
}

PUT /address/_bulk
{ "index": { "_id": "1"} }
{"province": "湖南","city": "长沙"}
{ "index": { "_id": "2"} }
{"province": "湖南","city": "常德"}
{ "index": { "_id": "3"} }
{"province": "广东","city": "广州"}
{ "index": { "_id": "4"} }
{"province": "湖南","city": "邵阳"}

GET /address/_search
{
  "query": {
    "match": {
      "full_address": {
        "query": "湖南常德",
        "operator": "and"
      }
    }
  }
}

本次先分享到这里,感谢各位观看!!!感兴趣的小伙伴可以关注收藏,持续更新中~~~文章来源地址https://www.toymoban.com/news/detail-841402.html

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

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

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

相关文章

  • 「 MySQL 入门」使用联表查询代替子查询的原因(附案例分析)

    参考鸣谢 MySQL Documentation PostgreSQL Documentation SQL Server Documentation 在关系型数据库中,查询是一项常见而重要的操作。在实际应用中,我们经常会遇到需要在多个表之间进行查询和关联的情况。传统的子查询是一种常见的解决方案,但随着数据量和复杂性的增加,使用联表查询

    2024年02月12日
    浏览(8)
  • 文本单词查询复合表达式求值的实现案例分析

    文本单词查询复合表达式求值的实现案例分析

            本文讨论的“ 文本单词查询复合表达式求值的实现 ”案例,来自C++ primer第四版,该案例面向对象编程和泛型编程, 涉及类的继承、抽象、多态、句柄、标准IO库、容器、算法库 ,是综合性很强的程序         该程序实现文本中查找单个单词,“非”查询(使

    2024年01月23日
    浏览(9)
  • 金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

    金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

    随着企业数据规模的增长和业务多元化发展,海量数据实时、多维地灵活查询变成业务常见诉求。同时多套数据库系统成为常态,这既带来了数据管理的复杂性,又加大了数据使用的难度,面对日益复杂的数据环境和严格的数据安全要求,需要解决多数据库系统并存、数据孤

    2024年04月26日
    浏览(18)
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。 function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。 近期有同学反馈,function_score 的相关参数不好理解,本文将深入探讨 function_score 的核心参数和函数。 Elasticsear

    2024年02月14日
    浏览(11)
  • openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

    openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

    195.1 分析查询语句运行状态 195.1.1 问题现象 系统中部分查询语句运行时间过长,需要分析查询语句的运行状态。 195.1.2 处理办法 以操作系统用户omm登录主机。 使用如下命令连接数据库。 postgres为需要连接的数据库名称,8000为端口号。 设置参数track_activities为on。 当此参数为

    2024年01月15日
    浏览(19)
  • openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题

    openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题

    198.1 分析查询效率异常降低的问题 198.1.1 问题现象 通常在几十毫秒内完成的查询,有时会突然需要几秒的时间完成;而通常需要几秒完成的查询,有时需要半小时才能完成。 198.1.2 处理办法 通过下列的操作步骤,分析查询效率异常降低的原因。 使用analyze命令分析数据库。

    2024年01月16日
    浏览(12)
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

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

    2024年02月04日
    浏览(17)
  • Elasticsearch (ES) 搜索引擎: 文本搜索:分析器/分词器、同义词/停用词、拼音搜索、高亮显示、拼写纠错

    原文链接:https://xiets.blog.csdn.net/article/details/132349032 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) 文本搜索主要指的就是全文搜索,全文搜索是搜索引擎的核心功能,与精确匹配的结构化数据不同,文本(text)数据在构建索引和搜索时都需要进行额外的处

    2024年02月03日
    浏览(14)
  • 对应分析介绍及SPSS案例分析

    对应分析介绍及SPSS案例分析

    在开展统计分析的过程中,分类变量(定序和定类变量)是我们研究的一个重点。通常我们分析分类变量间关系时,最常用的分析方法是卡方检验,其次是逻辑回归和对数线性模型等。 如果类别变量的分类较少,我们可以通过卡方检验判断行变量和列变量间是否相互独立,同

    2024年02月13日
    浏览(14)
  • python案例讲解视频,python简单案例分析

    python案例讲解视频,python简单案例分析

    大家好,给大家分享一下python案例讲解视频,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!   前言 Python 是一种面向对象、解释型、弱类型的脚本语言,它也是一种功能强大而完善的通用型语言。 相比其他编程语言(比如 Java),Python 代码非常简单,上手

    2024年04月11日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包