Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)

接上一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总》

说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。

1、ScriptQuery方法

  • 用途:它允许用户使用脚本(通常是 Painless 脚本语言)来定义查询逻辑。这种查询方法提供了极大的灵活性,因为脚本可以访问文档中的字段值、进行复杂的计算和逻辑判断,从而实现基于自定义规则的文档筛选。
  • 参数说明:
    • script:用于指定执行查询的脚本内容。脚本是用 Painless(Elasticsearch 默认的脚本语言)或其他支持的脚本语言编写的一段代码。这个脚本应该返回一个布尔值,用于判断文档是否匹配查询条件。
    • lang:用于指定脚本的语言。默认情况下,如果不指定,Elasticsearch 会使用 Painless 脚本语言。
  • 示例代码:
    • 要查询文章标题包含特定关键词且文章评分大于某个动态计算的阈值(根据文章内容长度来确定)的文章。
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      Script script = Script.of(s -> s.source("doc['article_title'].value.contains('科技') && doc['article_score'].value > doc['article_content'].value.length() * 0.1"));
      ScriptQuery scriptQuery = ScriptQuery.of(q -> q.script(script));
      Query query = scriptQuery._toQuery();

2、CommonTermsQuery方法

  • 用途:用于在文本搜索中平衡罕见词(低频词)和常见词(高频词)的重要性。这种查询方式旨在解决在传统的全文搜索(如match查询)中,常见词可能会过度影响搜索结果的相关性问题。
  • 参数说明:
    • query:这是最基本的参数,用于指定搜索的文本内容。它是一个字符串,代表用户输入的查询语句。这个字符串会被 Elasticsearch 的分析器处理,分解为一个个的词项,然后根据词频来进一步确定这些词项是高频词还是低频词。
    • cutoffFrequency:用于划分高频词和低频词的界限。它是一个浮点数,表示一个词项在索引文档集合中出现的频率阈值。词项的文档频率低于这个阈值的被视为低频词,高于这个阈值的被视为高频词。默认情况下,Elasticsearch 会根据索引的统计信息自动计算一个合适的值,但用户也可以根据具体情况进行调整。
    • lowFreqOperator:用于指定低频词的匹配逻辑。它可以取值为Operator.AND或者Operator.Or。当设置为Operator.And时,文档必须包含查询中的所有低频词才被视为匹配;当设置为Operator.Or时,只要文档包含查询中的任意一个低频词就被视为匹配。这个参数可以根据搜索的严格程度和用户需求来调整低频词的匹配条件。
    • highFreqOperator:类似于lowFreqOperator,但用于控制高频词的匹配逻辑。同样可以取值为Operator.And或者Operator.Or
    • boost:用于调整整个查询的权重。它是一个浮点数,大于 1 的值会提升查询的重要性,使得包含匹配词项的文档在搜索结果中的排名更靠前;小于 1 的值会降低查询的重要性。这个参数在与其他查询组合或者需要调整搜索结果排序时非常有用。
  • 示例代码:
    • 当搜索 “机器学习模型训练” 相关文档,并且希望文档必须包含所有低频词时。
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      CommonTermsQuery commonTermsQuery = CommonTermsQuery.of(q -> q.query("机器学习模型训练").lowFreqOperator(Operator.And));
      Query query = commonTermsQuery._toQuery();

3、WrapperQuery方法

  • 用途:将原生 Lucene 查询包装为 Elasticsearch 可执行的查询对象。通过将 Lucene 查询以字符串或字节数组形式传入,Elasticsearch 会在底层将其解析为 Lucene 可执行的查询,然后在索引数据上执行该查询操作,以获取匹配的文档结果。
  • 参数说明:
    • query:用于指定可执行查询的语句。为一个字符串,生成可执行DSL语句时,需要传入Base64编码后的字符串。
  • 示例代码:
    • 生成一个match查询的dsl语句。
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      String source = "{\"match\":{\"id\":\"222\"}}";
      WrapperQuery.Builder builder = new WrapperQuery.Builder();
      // base64串
      String value = Base64.getEncoder().encodeToString(source.getBytes(StandardCharsets.UTF_8));
      builder.query(value);
      Query query = builder.build()._toQuery();
      //结果: {"from":0,"query":{"wrapper":{"query":"eyJtYXRjaCI6eyJpZCI6IjIyMiJ9fQ=="}},"size":10}

4、CombinedFieldsQuery方法

  • 用途:即combined_fields查询,是一种多字段查询类型,用于在多个字段上进行组合查询。
    • 多字段模糊搜索:在实际应用中,用户可能不确定目标信息具体在哪个字段,通过CombinedFieldsQuery可以在多个可能的字段中进行模糊搜索,如在一个包含商品信息的索引中,同时在商品名称、描述、标签等字段中搜索用户输入的关键词,提高找到相关商品的概率。
    • 提升搜索结果相关性:通过对多个字段的综合考量和权重设置,能够更精准地评估文档与查询的相关性,将最相关的文档排在前面,提升用户获取有效信息的效率,改善搜索体验。
  • 参数说明:
    • query:用于指定要在多个字段中搜索的内容,可以是单个关键词、短语,也可以是复杂的查询语句,如使用通配符*?进行模糊查询,或使用~进行模糊匹配等。
    • fields:是一个字符串数组,用于指定要进行组合查询的字段列表。例如["field1", "field2", "field3"]
    • operator:用于指定多个字段之间的逻辑组合关系,默认为or,即只要文档在其中一个指定字段中匹配成功,就认为该文档符合查询条件。若设置为and,则要求文档必须在所有指定字段中都匹配成功才符合查询条件。
    • tie_breaker:当多个文档在不同字段上的匹配程度相近时,用于调整文档的得分。它是一个浮点数,取值范围在 0 到 1 之间。默认值为 0,表示不进行额外的得分调整;如果设置为一个非零值,例如 0.3,则会在计算文档得分时,将匹配多个字段的文档的得分适当提高,以使其在搜索结果中更靠前。
    • minimum_should_match:用于指定至少需要在多少个字段中匹配成功才能返回该文档。可以是具体数字,如2,表示至少在两个字段中匹配成功;也可以是百分比,如50%,表示至少在指定字段数量的一半字段中匹配成功。
  • 示例代码:
    • 要查询产品名称和产品描述字段同时包含“高清”的文档。
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      CombinedFieldsQuery.Builder combinedFields = QueryBuilders.combinedFields();
      combinedFields.fields("product_description","product_name");
      combinedFields.query("高清");
      combinedFields.operator(CombinedFieldsOperator.And);
      combinedFields.minimumShouldMatch("60%");
      Query query = combinedFields.build()._toQuery();

5、HasChildQuery方法

  • 用途:用于在父文档和子文档之间进行关联查询的方法。
    • 父子文档关联查询:当数据在 Elasticsearch 中以父子文档关系存储时,HasChildQuery允许你根据子文档的条件来查找对应的父文档。例如,在一个电商系统中,订单是父文档,订单中的商品是子文档,你可以使用HasChildQuery通过商品的某些属性(如价格范围、商品类别等)来查询对应的订单。
    • 复杂条件筛选父文档:可以基于子文档中的多个字段组合条件来筛选父文档,实现更灵活的查询需求。比如在一个论坛系统中,帖子是父文档,评论是子文档,通过HasChildQuery可以查找出包含特定关键词评论的帖子。
  • 参数说明:
    • type:用于指定子文档的类型。在 Elasticsearch 中,父子文档在同一个索引中,但子文档有自己特定的类型,通过该参数明确要查询的子文档类型。
    • query:用于定义子文档查询条件的查询对象。可以使用 Elasticsearch 提供的各种查询构建器来构建复杂的子文档查询条件,如termQueryrangeQueryboolQuery等。
    • score_mode:用于指定如何计算父文档的得分。默认为none,即父文档的得分不受子文档的影响;还可以设置为sumavgmaxmin等,分别表示将子文档的得分进行求和、求平均、取最大值、取最小值后作为父文档的得分。
    • innerHits:允许你在查询父文档的同时,获取与父文档匹配的子文档的详细信息
    • min_children和max_children:用于限制子文档的数量范围。min_children指定子文档数量的最小值,max_children` 指定子文档数量的最大值。如果子文档数量不在这个范围内,父文档将不被返回。
    • ignore_unmapped:默认为false。如果设置为true`,当查询中涉及的子文档字段不存在或未映射时,将忽略该字段,而不是抛出异常。
  • 示例代码:
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      HasChildQuery.Builder hasChild = QueryBuilders.hasChild();
      hasChild.type("child_doc_type");
      hasChild.query(QueryBuilders.term(t -> t.field("child_field").value("search_term")));
      hasChild.scoreMode(ChildScoreMode.Max);
      hasChild.innerHits(i->i.fields("specific_inner_hits_name").size(5).from(0));
      Query query = hasChild.build()._toQuery();

6、HasParentQuery方法

  • 用途:用于根据父文档条件来查询子文档的查询方法。
    • 关联查询子文档:当文档存在父子关系时,通过HasParentQuery可以方便地根据父文档的特定条件来查找与之关联的子文档。例如,在一个电商系统中,根据商品分类(父文档)来查询该分类下的具体商品(子文档);或者在论坛系统中,根据文章(父文档)来查找其对应的评论(子文档)等。
    • 数据筛选与分析:能够快速筛选出符合父文档条件的子文档集合,便于进行进一步的数据分析和处理,如统计某个父文档下子文档的数量、对匹配的子文档进行聚合操作等。
  • 参数说明:
    • parentType:指定父文档的类型,用于明确查询所依据的父文档类型,是必选参数。
    • query:用于定义父文档需要满足的查询条件,通常使用 Elasticsearch 的查询构建器来构建,如termQuerymatchQuery等。
    • score:指示是否将匹配父文档的相关性分数聚合到其子文档中。
    • ignore_unmapped:默认为false。当父文档类型在某些子文档索引中不存在映射时,设置为true可以忽略该错误,继续执行查询。
  • 示例代码:
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      HasParentQuery.Builder hasParent = QueryBuilders.hasParent();
      hasParent.parentType("parent_doc_type");
      hasParent.query(QueryBuilders.term(t -> t.field("parent_field").value("search_term")));
      hasParent.score(true);
      hasParent.innerHits(i->i.fields("specific_inner_hits_name").size(5).from(0));
      Query query = hasParent.build()._toQuery();

7、IdsQuery方法

  • 用途:用于根据文档_id进行精确匹配查询的方法。

    • 精准查询:当你确切知道要查询的文档_id时,使用IdsQuery可以快速、精准地获取到对应的文档,而无需进行复杂的全文搜索或条件筛选。
    • 批量查询:可以同时传入多个_id进行批量查询,一次性获取多个指定文档的详细信息,方便快捷地检索特定的一批数据。
  • 参数说明

    • values:用于指定要查询的文档_id的值,可以是单个_id字符串,也可以是包含多个_id字符串的数组或集合。

  • 代码示例
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      IdsQuery.Builder ids = QueryBuilders.ids();
      ids.values("1", "2");
      Query query = ids.build()._toQuery();

8、TypeQuery方法

  • 用途:用于根据文档类型进行查询的方法

  • 参数说明

    • value:用于指定要查询的文档类型名称。

  • 代码示例
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      TypeQuery.Builder type = QueryBuilders.type();
      type.value("doc_type");
      Query query = type.build()._toQuery();

9、GeoShapeQuery方法

  •  用途:用于对地理形状数据进行查询的方法,它允许用户根据地理形状之间的空间关系来查找匹配的文档。基于地理空间数据的索引和搜索功能,通过比较查询的地理形状与文档中存储的地理形状之间的关系,如相交、包含、在内部等,来确定是否匹配。利用了 Elasticsearch 的空间索引结构,能够高效地处理地理形状数据的查询,提高查询速度和准确性。

  • 参数说明

    • field:必选参数,指定文档中存储地理形状数据的字段名。
    • shape:必选参数,GeoShapeFieldQuery对象
      • shape:定义要查询的地理形状,可以是各种几何形状,如点(Point)、线(LineString)、多边形(Polygon)等,还可以通过坐标数组或 GeoJSON 格式来表示。
      • relation:可选参数,指定查询形状与文档中形状的空间关系,默认为INTERSECTS,即相交关系。其他可选关系包括WITHIN(在内部)、CONTAINS(包含)等。
  • 代码示例
    • import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
      GeoShapeFieldQuery.Builder geoShapeField = new GeoShapeFieldQuery.Builder();;
      geoShapeField.shape(JsonData.of("POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))"));
      geoShapeField.relation(GeoShapeRelation.Within);
      GeoShapeQuery.Builder geoShape = QueryBuilders.geoShape();
      geoShape.field("location_field");
      geoShape.shape(geoShapeField.build());
      Query query = geoShape.build()._toQuery();

后续补充:

IntervalsQuery
ParentIdQuery
PercolateQuery
PinnedQuery
RankFeatureQuery
RuleQuery
ScriptScoreQuery
SemanticQuery
ShapeQuery
SpanContainingQuery
SpanFieldMaskingQuery
SpanFirstQuery
SpanMultiTermQuery
SpanNearQuery
SpanNotQuery
SpanOrQuery
SpanTermQuery
SpanWithinQuery
SparseVectorQuery
TextExpansionQuery
WeightedTokensQuery

GeoPolygonQuery
GeoDistanceQuery
GeoBoundingBoxQuery
FunctionScoreQuery
DistanceFeatureQuery
DisMaxQuery
ConstantScoreQuery
KnnQuery

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Ubuntu 22.04 上安装 Strapi CMS

简介 Strapi 是一个使用 JavaScript 构建的开源、无头内容管理系统 (CMS)。与其他无头 CMS 一样,Strapi 开箱即用不带前端。它使用 API 作为其前端,允许你使用流行的框架(如 React 和 Next.js)构建网站。Strapi 基于插件系统&…

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level(门级)网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络(RNN)1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN(1)RNN实例化(2)forward函数(3&#xf…

如何评估呼叫中心大模型呼出机器人的使用效果?

如何评估呼叫中心大模型呼出机器人的使用效果? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 评估呼叫中心大模型呼出机器人的使用效果是一个复杂而多维的过程,需要综合考虑多个方面&…

WSL2内部的Ubuntu怎么设置网络内桥接模式,弄了好久老是不成功,怎么办?

环境: Win10专业版 WSL2 Ubuntu22.04 问题描述: WSL2内部的Ubuntu怎么设置网络内桥接模式 解决方案: 方法一 1.控制面板开启,Hyper-V 管理器 2.重启电脑 3…创建外部虚拟交换机 打开 Hyper-V 管理器,在右侧操作面板中点击“虚拟交换机管理器”。 选择“创建虚…

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…

记录学习《手动学习深度学习》这本书的笔记(五)

这一章是循环神经网络,太难了太难了,有很多卡壳的地方理解了好久,比如隐藏层和隐状态的区别、代码的含义(为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解)、梯度计算相关(【笔记】记录…

人大金仓数据linux安装注意事项

人大金仓数据linux安装注意事项 本次是个人搭建虚拟机安装centos7的环境下进行安装。 1、安装流程参照https://help.kingbase.com.cn/v9/install-updata/install-linux/preface.html。 2、mount安装文件报错 操作手册提供mount的命令如下: mount KingbaseES_V009R0…

【GIS教程】使用GDAL-Python将tif转为COG并在ArcGIS Js前端加载-附完整代码

目录 一、数据格式 二、COG特点 三、使用GDAL生成COG格式的数据 四、使用ArcGIS Maps SDK for JavaScript加载COG格式数据 一、数据格式 COG(Cloud optimized GeoTIFF)是一种GeoTiff格式的数据。托管在 HTTP 文件服务器上,可以代替geose…

探索智能时代:如何利用AI一键生成PPT改变演示文稿的制作方式

在这个科技飞速发展的时代,信息的传递方式发生了翻天覆地的变化。曾几何时,我们还在为制作PPT而熬夜,手动选择模板、调整布局,甚至为每一张幻灯片的内容苦思冥想。然而,随着人工智能技术的不断进步,制作PPT…

【LDAP】LDAP概念和原理介绍

目录 一、前言 二、什么是LDAP? 2.1 什么是目录服务? 2.2 LDAP的介绍 2.3 为什么要使用LDAP 三、LDAP的主要产品线 四、LDAP的基本模型 4.1 目录树概念 4.2 LDAP常用关键字列表 4.3 objectClass介绍 五、JXplorer工具使用 一、前言 对于许多的…

nginx模板文件

nginx模板配置 背景模板文件nginx.conf容器验证 背景 nginx通过读取环境变量完成对nginx.conf的相关代理设置,但是nginx.conf不支持直接读取环境变量、所以使用nginx的模板功能达到相应目的 带有环境变量的 Nginx 配置文件模板。在 Docker 化部署 Nginx 时&#x…

流架构的读书笔记(1)

流架构的读书笔记(1) 一、什么是流? 流是一种网络化的软件集成,它是事件驱动的,松耦合的 高度灵活的和可高度扩展的。它主要是由标准接口和协议 定义的,这些接口和协议能够以最小的冲突和工作量实现 集成…

善于运用指针(四)--指针数组和多重指针

一个数组的元素均为指针类型,称为指针数组。指针数组中的每一个元素应都有地址,相当于一个变量。 文章目录 前言 一、指针数组的定义 二、指向指针数组的指针变量 1.指针数组 2.多重指针 三、main函数的参数 1.argc argv envp 总结 前言 主要是指针数组…

12篇--图像轮廓绘制与最小外接问题

何为轮廓? 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。与边缘有什么区别与联系呢? 相对于边缘,轮廓是连续的,边缘不一定连续,如下图所示。其实边缘主要是作为图像的特征使用,比如…

3.8 路由选择器协议

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 静态路由选择2 动态路由选择3 自治系统(AS)4 域内路由选择5 域间路由选择7 路由器基本结构 前言 在计算机网络中,路由选择协议起着至…

#渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘02之逻辑漏洞技巧

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 逻辑漏洞技巧 1、任意用户 1.1 验证码可爆…

CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现

操作: 根据CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞搭建复现的靶场环境 拿到环境的源码使用docker搭建 cd vuln 创建容器并启动 docker build -t cve-2024-38819-poc .docker run -d -p 8080:8080 --name cve-2024-38819-poc cve-2024-38819-po…

C#调用C++接口时,如何使用结构体参数

在C#中调用C接口时,通常使用平台调用服务(P/Invoke)或通过C/CLI创建托管包装器来实现。当涉及到结构体参数时,处理方式取决于几个因素,包括结构体的复杂度、是否需要在C和C#之间传递结构体、以及性能考虑。 以下是几种…

在pycharm2024.3.1中配置anaconda3-2024-06环境

version: anaconda3-2024.06-1 pycharm-community-2024.3.1 1、安装anaconda和pycharm 最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客 【2024最新版】超详细Pycharm安装保姆级教程,Pycharm环境配置和使用指南,看完这一篇就够了…