springboot~elasticsearch对nested集合类型的字段进行不等于的检索

对于es的数据类型来说,如果它是一个复杂类型,而我们需要把复杂类型进行检索,那么应该定义成 nested类型,而对于它的检索,如果是非集合数据,它与其它类型没有分别;而如果你的nested存储的数据是一个集合,那在进行不等于这种操作时,就需要说明一下了。

举例子

"id": "1",
"operate": [
  {
  "actionTime": "2017-03-21 11:57:37.700",
  "operateType": "WangLu",
  "wordNum": "3188",
  "userName": "zidongluru"
  },
  {
  "actionTime": "2017-03-21 11:57:37.700",
  "operateType": "DaoRu",
  "wordNum": "3188",
  "userName": "qinbixue1609"
  }
]

对于上面的数据,其中operate是一个nested类型的,它存储数据为一个集合,我们查询operateType不等于WangLu的数据,如果直接使用not_must配合term,那结果是不对的,它会把这个文档正常返回,为什么?按说这个operate里是包含了 WangLu的,如果包含它是不应该返回的;这就是es检索nested集合处理不等于的问题,当会查询所有集合中的元素,有一个不等于 WangLu的,它就认为是不等于的,这与我们的需求不符合,所以要想其它方法。

script脚本检索nested集合失败

{
  "size": 5,
   "_source": [
    "Gid",
    "Type",
    "operate"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "operate",
            "query": {
              "script": {
                "script": "doc['operate.operateType'].stream().map(o->o).filter(o->o=='YiJiaoSu').count()==0"
               }
            }
          }
        },
        {
          "term": {
            "Gid": "1970325267114815"
          }
        }
      ]
    }
  }
}

使用function方式解决了这个问题

{
  "size": 5,
  "_source": [
    "Gid",
    "Type",
    "operate"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "function_score": {
            "query": {
              "match_all": {}
            },
            "functions": [
              {
                "script_score": {
                  "script": {
                    "source": "params._source.operate.stream().map(o->o.operateType).filter(o->o=='YiJiaoSu').count()==0 ? 1 : 0"
                  }
                }
              }
            ],
            "min_score": 1
          }
        },
        {
          "term": {
            "Id": "1970325267114815"
          }
        }
      ]
    }
  }
}

这种由于是集合里的集合再检索,所以需要和其它检索条件一起用,全表检索,性能比较差。

翻译成java客户端代码

  String val = "条件";
  String name = "nested内部字段名";
  String scoreStr = "params._source.operate==null || params._source.operate.stream().map(o->o." + name + ").filter(o->o=='" + val + "').count()==0? 1 : 0";
  Script sc = new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scoreStr, MapUtil.empty());
  ScriptScoreFunctionBuilder builder = new ScriptScoreFunctionBuilder(sc);
  FunctionScoreQueryBuilder scoreBuilder = QueryBuilders.functionScoreQuery(builder);
  scoreBuilder.setMinScore(1);
  scoreBuilder.scoreMode(FunctionScoreQuery.ScoreMode.FIRST);
  queryIncludeBuilder.must(scoreBuilder);

Original: https://www.cnblogs.com/lori/p/16615252.html
Author: 张占岭
Title: springboot~elasticsearch对nested集合类型的字段进行不等于的检索

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576070/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • histogram的类型详解

    采样点 每隔指定的时间会采集并上报一次数据,称为采样点。 请注意这里采集的是当前瞬间的数据 count 对采样点的 次数累计和(count) bucket 对采样点的 次数进行统计…

    数据库 2023年6月9日
    0185
  • MySQL80下载安装/使用/连接报错

    @ * – 一、MySQL80下载 + 这里用社区版Community Server + 下载运行 * 仅Server Only安装就行 * 产品配置,click ne…

    数据库 2023年5月24日
    0126
  • 数据库发展史2–数据仓库

    ​ 回顾数据仓库的发展历程,大致可以将其分为几个阶段:萌芽探索到全企业集成时代、企业数据集成时代、混乱时代–“数据仓库之父”间的论战、理论模型确…

    数据库 2023年6月11日
    0117
  • mysql

    mysql 1.1数据库 关系型数据库:数据存储在硬盘上 [En] Relational database: the data is stored in the hard disk…

    数据库 2023年5月24日
    0110
  • 我的JAVA面试题备忘录

    以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在…

    数据库 2023年6月6日
    074
  • Redis-实现分布式锁

    单节点分布式锁 本地的锁操作非常常见,无非就是申请一个锁变量lock, 加锁时,判断锁变量是否被持有,如果被持有中,则加锁失败,如果不被持有,则加锁成功,将锁的状态改为持有锁的这个…

    数据库 2023年6月11日
    084
  • Mongodb使用总结

    Mongodb使用总结 基于内存操作,便于与网站交互 数据库-集合-文档(存储多种数据类型),我们的操作都是基于单文档进行操作,并且通过冗余字段进行操作 嵌入式数组文档减少了对昂贵…

    数据库 2023年6月11日
    094
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【2】

    坦克大战【2】 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 线程-应用到坦克大战 坦克大战0.3版 陆游曾说…

    数据库 2023年6月11日
    0110
  • MyBatis详解

    😀搭建 MyBatis mysql mysql-connector-java 8.0.29 org.mybatis mybatis 3.5.7 junit junit 4.12 t…

    数据库 2023年6月14日
    093
  • 我是个怎样的人

    我是一个怎样的人 我是一个怎样的人, 我是一个虚伪的人. 我麻木的观察着这个世界, 对好坏, 真假, 我都去同样看待, 不去区分. 我是一个怎样的人, 我是一个善良的人. 我温柔的…

    数据库 2023年6月9日
    096
  • HA: FORENSICS靶机练习

    ubuntu拿到手,没有恢复模式,不好绕密码,仿真软件又会更改所有用户的密码,怕影响后续操作,先不采用,先试试用john跑一下看看能不能跑出一两个来。 刚好跑出来一个,用户 &lt…

    数据库 2023年6月11日
    0103
  • MySQL45讲之用户关注案例

    本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。 业务背景 业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,关系(rela…

    数据库 2023年5月24日
    0150
  • eclipse调用MySQL数据库的方法

    今天来总结一下使用如何使用eclipse调用MySQL数据库的数据。 一、设置eclipse 我们首先来设置一下eclipse。 在下部的Servers中右键选择new,选择ser…

    数据库 2023年6月11日
    0144
  • java通过内存流去掉多行文本中的空行

    对于多行文本,你直接通过replace,replaceAll是不能将空行删除的,你需要遍历这些行,对每行文本进行操作,最后把返回新的文本才行。 public static Stri…

    数据库 2023年6月6日
    0102
  • 部署zabbix监控服务

    部署zabbix监控服务 部署zabbix监控服务 什么是zabbix zabbix的特点 zabbix的配置文件 部署zabbix zabbix服务端安装 准备工作 数据库操作 …

    数据库 2023年6月14日
    0110
  • MySQL——基础查询与条件查询

    基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1、查询列表可以是:表中的字段、常量值、表达式、函数 …

    数据库 2023年5月24日
    0127
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球