[ElasticSearch]间隔搜索IntervalsQuery及JavaSDK简单调用

2023-11-13

1) 概念

* intervals query 允许用户精确控制查询词在文档中出现的先后关系,实现了对terms顺序、terms之间的距离以及它们之间的包含关系的灵活控制
    通过intervals query(间隔搜索) 我们可以完成各个terms在于不同位置的灵活搜索
    
* 下面来举一个例子来说明间隔搜索的适用场景:
    我们在某个索引中3个包含my_text字段的文档

    文档1:  {"my_text":"curry bad shooter.... "}
    文档2: {"my_text":"curry good shooter....."}
    文档3:  {"my_text":"curry best shooter...."}


    通过间隔搜索,我可以明确的表示 我不想看到curry和shooter之间存在 bad的文档
    我还可以明确的表示,我必须看到curry和shooter之间 存在 某个词 的文档
    我也可以明确的表示,curry必须在best之前等等一系列功能
    
* 例如 我不想看到curry和shooter之间存在bad,DSL如下:
 

{
  "query": {
    "intervals": {
      "content": {
        "match": {
          "query": "curry shooter",
          "ordered": true,
          "filter": {
            "not_containing": {
              "match": {
                "query": "bad"
              }
            }
          }
        }
      }
    }
  }
}

2) 参数

* 首先来看一个略复杂的DSL语句并简单理解后学习参数

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "stephen curry",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "best shooter" } },
                  { "match" : { "query" : "cute champion" } }
                ]
              }
            }
          ]
        },
        "boost" : 2.0
      }
    }
  }
}

简单概述上方语句,像包含"stephen curry is best shooter"或者"stephen cuury is cute champion"都会被检索到,但是 "best shooter who is stephen curry" 不会被检索到,因为我们通过ordered参数明确定义了多个intervals的顺序。


你一定看到了all_of并不解,此处简单解释,在某些时候 一个intervals无法满足我们的要求,那么我们可以编写多个intervals,将其放在all_Of内部,表示所有的intervals都要生效,同样内部可以再次嵌套,比如any_of 表示内部的多个intervals只需满足其一即可。

  • match

参数 描述
query 用户查询的字符串
max_gaps 字符串中多个词之间的的最大词间距,超过最大间距的将不会被检索到;默认值是-1,即无距离限制,设置为0的话,query中的字符串必须彼此相连不能拆分
ordered query中的字符串是否需要有序显示,默认值是false,即不考虑先后顺序,该参数推荐为true,手动控制词间位置顺序
analyzer 对query参数中的字符串使用什么分词器,默认使用mapping时该field配置的 search_analyzer
filter intervals独有的过滤语法,下方有说明
  • all_of

参数 描述
intervals 一个interval集合,集合里面的所有match需要同时在一个文档数据上同时满足才行
max_gaps 多个interval查询在一个文档中允许的最大间距,超过最大间距的将不会被检索到;默认值是-1,即不限制,设置为0的话,所有的interval query必须彼此相连不能拆分
ordered 配置 intervals 出现的先后顺序,默认值false
filter intervals独有的过滤语法,下方有说明
  • any_of

参数 描述
intervals 一个interval集合,集合中只需满足其一即可
filter intervals独有的过滤语法,下方有说明
  • filter

在例子中我们提到filter,通过filter和intervals设定的规则可以过滤掉一些我们不想要的间隔词汇的文档,当然filter不仅仅只包含not_contaning参数
     常用的filter参数,如下:
参数 描述
containing interval query中terms之间需要包含filter中的terms
contained_by interval query中的字符串需要被包含在filter query的terms里
not_containing containing 对立面
not_contained_by (比较模糊,有心得的小伙伴可以私信我)contained_by 对立面

此处比较建议使用 containing和not_containing,而不建议使用contained_by和not_contained_by

我们更愿意在query中输入想查询的词条 在fitler中过滤。

  • script filters

如果上面filters语句不能满足你的需求,那么可以尝试一下script filter ,它提供了一个interval变量,通过start、end、gaps三个函数更加灵活的控制term在文本中的顺序与距离:
* 例如下方语句简单解释一下:

POST _search
{
  "query": {
    "intervals": {
      "content": {
        "match": {
          "query": "curry shooter",
          "filter": {
            "script": {
              "source": "interval.start >= 2 && interval.end < 5 && interval.gaps == 1"
            }
          }
        }
      }
    }
  }
}


    curry(interval.start)要出现在偏移量>=2的位置,shooter(interval.end)要出现在偏移量<5的位置 并且curry和shooter之间的间距(intercal.gaps)为1 才可以查得到    

3) JavaSDK

* 参照下方DSL编写简单Java Api调用

虽然调用方式有所不同,不过最后本质上依然是一个queryBuilder工厂铸造的对象,可以放入bool中配合其他查询一起使用!
 

            {
              "query": {
                "intervals": {
                  "content": {
                    "all_of": {
                      "max_gaps": 5,
                      "ordered": true,
                      "intervals": [
                        {
                          "match": {
                            "query": "Curry shooter",
                            "max_gaps": 1,
                            "ordered": "true",
                            "filter": {
                              "not_containing": {
                                "match": {
                                  "query": "bad"
                                }
                              }
                            }
                          }
                        }
                      ]
                    },
                    "boost": 2
                  }
                }
              }
            }
 public void customerIntervalsQuery() throws IOException {
   
        // 构建intervals数组
        List<IntervalsSourceProvider> intervalsSourceProviderList = new ArrayList<>(16);
        // 构建内层match
        IntervalsSourceProvider.IntervalFilter intervalFilter = new IntervalsSourceProvider.IntervalFilter(new IntervalsSourceProvider.Match("bad", 0, true, null, null, null), "not_containing");
        IntervalsSourceProvider.Match mainProvider = new IntervalsSourceProvider.Match("Curry shooter", gaps, true, null, intervalFilter, null);
        // 将math加入intervals[]
        intervalsSourceProviderList.add(mainProvider);



        // 最后放入all of对象中
        IntervalsSourceProvider intervalsSourceProvider = new IntervalsSourceProvider.Combine(intervalsSourceProviderList, true, 5, null);
        // all of放入最外层的intervals
        IntervalQueryBuilder intervalQueryBuilder = new IntervalQueryBuilder("content", intervalsSourceProvider);
        SearchRequest request = new SearchRequest("test_index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(intervalQueryBuilder);
        System.out.println(searchSourceBuilder.toString());

		// 发送请求
        request.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits);
    }

Except for the passage of time and the separation of life and death,I can do all things.

参考资料:

Intervals query | Elasticsearch Guide [7.9] | Elastic

ElasticSearch官方文档

Elasticsearch Intervals query 间隔查询_yuanxun4683的博客-CSDN博客_elasticsearch interval

作者:墨菲灬

9.2.1-elasticsearch全文检索之intervals查询_红笺小字-CSDN博客

作者:hjx

elasticsearch 7.0 新特性之Intervals query - 简书

作者:码到成功_易企秀

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[ElasticSearch]间隔搜索IntervalsQuery及JavaSDK简单调用 的相关文章

随机推荐

  • R语言相关关系可视化函数梳理

    点击蓝字关注这个神奇的公众号 作者 赵镇宁 R语言中文社区特约作者 当考察多个变量间的相关关系时 通常将多个变量的两两关系以矩阵的形式排列起来 R提供了散点图矩阵 相关矩阵等多种可视化方案 囊括了众多函数 本文对R语言相关关系可视化的函数进
  • iOS开发笔记--识别单击还是双击

    在视图上同时识别单击手势和双击手势的问题在于 当检测到一个单击操作时 无法确定是确实是一个单击操作或者只是双击操作中的第一次点击 解决这个问题的方法就是 在检测到单击时 需要等一段时间等待第二次点击 如果没有第二次点击 则为单击操作 如果有
  • spring 组件 扫描

    ComponentScan basePackages com 组件扫描 ComponentScan等价于 AnnotationConfigApplicationContext context new AnnotationConfigAppl
  • Web安全工具—nc(瑞士军刀)持续更新

    Web安全工具 nc 瑞士军刀 持续更新 提要 本文主要介绍NC工具的常用功能和原理 其他功能后续可在实际使用中进行学习和记录 简介 NC又被称为netcat 安全界成为瑞士军刀 其通常作用于渗透测试中信息收集和内网渗透阶段 主要功能 常用
  • GD32F103基础教程—外部中断实验(八)

    一 教程简介 本章主要是讲解GPIO输入实验 通过按键触发外部中断 控制LED2闪烁 二 实验流程 1 工程配置 外部中断触发实验工程配置方法与第五章的配置方法一致 具体请查看第五章教程 本章不再赘述 2 源码讲解 1 LED初始化 与之前
  • 使用Quartz2.2.3做持久化,启动程序后,控制台报错问题

    该错误是由mysql connector java jar版本太低导致 MLog clients using log4j logging Initializing c3p0 0 9 1 1 built 15 March 2007 01 32
  • 虚拟DOM中key的作用

    key是虚拟DOM的标识 如果数据发生变化时 Vue会根据 新数据 生成新虚拟DOM 和 旧虚拟DOM 的差异对比 如果旧虚拟DOM和新虚拟DOM的key值相同 并且虚拟DOM内容没有变 就直接使用原来的真实DOM 如果虚拟DOM中的内容变
  • PLC软元件2

    1 概述 上篇文章主要讲述了PLC中最基本的输入和输出软元件 同时在文章最后以最基本的输入和输出软元件完成一个比较基础的自锁和互锁功能 不太清楚的同学可以翻看上一篇文章 那PLC只有这些软元件么 其实远远不止 上次文章也讲了基本上MCU所具
  • ICCV 2023

    导读 TL DR 本文提出了FeatEnHancer 一种用于低光照视觉任务的增强型多尺度层次特征的新方法 提议的解决方案重点增强相关特征 通过提供强大的语义表示 使其优于现有的低光照图像增强方法 该方法不仅改进了单个特征的质量 而且还有效
  • ctfshow 文件包含

    目录 web78 web79 web80 81 web82 web83 web78 简单的伪协议文件包含 payload php filter convert base64 encode resource flag php web79 pa
  • npm install安装sharp包失败

    初次使用Lincm 使用后端koa框架初始化环境报错 npm config set sharp binary host https npm taobao org mirrors sharp npm config set sharp libv
  • Groovy与Java的不同点

    本文参考自Groovy文档 Differences with Java 所有代码都是Groovy文档中的 也可以将本文看做英文源文档的简略翻译 Groovy设计时目标之一就是让Java程序员快速习惯Groovy 不过在Groovy中也有很多
  • C#数据库MS SQL打开关闭演示

    书上记的比喻 有助于记忆 ADO NET类 CONNECTION对象好比伸入水中的水龙头 保持与水的接触 只有它与水进行了连接 其它对象才可以抽到水 COMMAND对象则像抽水机 为抽水提供动力和执行方法 先通过水龙头 然后把水返回给上面的
  • linux下rename函数用法,Linux学习之关于rename的用法

    linux下的rename是有两个版本的 一个是C语言版本 一个是Perl语言版本 如何判断当前是哪个版本 输入man rename 看到第一行是 RENAME 1 Linux Programmer s Manual RENAME 1 这个
  • 架构简洁之道:从阿里开源应用架构COLA说起

    导读 COLA 的主要目的是为应用架构提供一套简单的可以复制 可以理解 可以落地 可以控制复杂性的 指导和约束 在实践中作者发现 COLA 在简洁性上仍有不足 因此给 COLA 做了一次 升级 在这次升级中 没有增加任何新的功能 而是尽量多
  • 通过user-agent判断用户是用QQ、微信还是支付宝打开链接或二维码

    通过user agent判断用户是用QQ 微信还是支付宝打开链接或二维码 function is weixn qq var ua navigator userAgent toLowerCase if ua match MicroMessen
  • 表格嵌套表格css_HTML5和CSS3的登录和注册表格

    表格嵌套表格css View demo 查看演示 Download Source 下载源 In this tutorial we are going to create two HTML5 forms that will switch be
  • 快速理解Faster RCNN

    Faster RCNN 1 网络结构 2 锚框生成 3 RPN结构 4 Roi pooling 5 分类和回归任务 6 损失函数 7 训练流程 1 网络结构 首先输入图像 进行尺度裁剪成固定的M N 如果比例不匹配可以先填充再裁剪 back
  • 云计算入门——IT架构九重天

    文章目录 一 概述 二 各层简述 2 1 基础层 2 2 计算机网络 2 3 存储层 2 4 服务器层 2 5 操作系统层 2 6 数据库层 2 7 中间件 运行库 2 8 应用软件 2 9 数据层 一 概述 一个公司搭建IT应用一般都会涉
  • [ElasticSearch]间隔搜索IntervalsQuery及JavaSDK简单调用

    1 概念 intervals query 允许用户精确控制查询词在文档中出现的先后关系 实现了对terms顺序 terms之间的距离以及它们之间的包含关系的灵活控制 通过intervals query 间隔搜索 我们可以完成各个terms在