技术标签: elasticsearch
* 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"
}
}
}
}
}
}
}
}
* 首先来看一个略复杂的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中过滤。
如果上面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 才可以查得到
* 参照下方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);
}
参考资料:
Intervals query | Elasticsearch Guide [7.9] | Elastic
ElasticSearch官方文档
Elasticsearch Intervals query 间隔查询_yuanxun4683的博客-程序员宅基地_elasticsearch interval
作者:墨菲灬
9.2.1-elasticsearch全文检索之intervals查询_红笺小字-程序员宅基地
作者:hjx
elasticsearch 7.0 新特性之Intervals query - 简书
作者:码到成功_易企秀
文章浏览阅读720次。启用Oracle DISM触发的Solaris系统挂死bug_oracle rac 其中一台挂了
文章浏览阅读59次。View Code 1 2 /* 3 思路: 4 比如:n=100,m=5 5 100是有20个5组成的 6 因此100减去一个5是95 ,减去两个是90 7 ...减去19个是0. 8 则是5 倍数的数有二十个(不是m的倍数的不能分解出m) 9 ,从这二十个10 数中各分解出一个5则有20个511 这二十个数变为12 20,19,18,...,1即 20的阶乘13 相当...
文章浏览阅读4.7k次。为了快速输入身份证号码、电话号码、银行账号等数字时确保正确又不用检查, 输入数字时同时发声是很好的方法,所以我制作了这个”语音数字“脚本,非常好用。 注:本脚本需配合”0—9和点“的语音文件一起使用,可下载类似读数软件从中提取。;----------------------------; 语言数字 v2.0 By FeiYue;; 说明:将本脚本和语音文件放在同一目录编译即可;----------------------------#NoEnv#SingleInstance force_. 3t@u,。
文章浏览阅读1.1k次。三种进化算法:遗传算法、粒子群算法、差分算法,以及它们再Rosenbrock函数优化问题中的应用。这是一篇学习笔记,可能有纰漏。_差分进化算法和粒子群
文章浏览阅读817次,点赞21次,收藏9次。Sora普通人理解的原理——帧处理_sora每生成一帧需要消耗
文章浏览阅读5.6k次。随着文档数字化的发展,光学字符识别 (OCR) 变得越来越流行,OCR 在处理基于图像的文档中发挥着至关重要的作用。基于电商APP移动端的业务场景,是否也能利用OCR来为用户提供更加便利的购物体验呢。_tesseract 中文训练模型
文章浏览阅读472次。slf4j的jar包冲突。SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/D:/apache-maven-3.5.3/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/..._jar:file:/d:/program%20files/apache-maven-3.5.4/repository/io/springfox/spri
文章浏览阅读3.6k次。今天大部分时间一直被一个问题困扰:当程序执行某Mapper.java的一个list函数,明明底层的SQL语句和ELK中的日志都显示返回了376条记录(如图1,图2),最后程序却只返回了209条。图1: 日志显示此list函数返回了376条记录图2: 日志有376条相关的ResultSet记录我一度以为这跟今天尝试使用的MyBatis分页插件PageHelper(使用了MySql的limit)有关,后面发现不是。即使不使用PageHelper,问题依旧。而且我发现一点:实际返回的209条记录里,似乎_mybatis去重
文章浏览阅读1.5k次。本人首先按照网上的方法申请了百度翻译 API,配置后出现IP无法访问,后选择以下方法解决。配置如图:参考:https://blog.csdn.net/ilyucs/article/details/106603368_翻译失败: 访问ip地址不在可访问ip列表
文章浏览阅读67次。MySQL安装sudo apt-get install mysql-server-5.6设置密码本地连接MySQL数据库root用户登录 :mysql -u root -p show databases;#显示数据库use mysql;#进入数据库show tables;#显示数据表远程连接数据库安装MySQL workbench连接数据库服务器,如果出现10061错误 cd /etc/mysql/ sudo vim my.cnf #打开MySQL配置文件将 _mysql 安装 远程
文章浏览阅读1.5k次。1.display:none;的缺陷 搜索引擎可能认为被隐藏的文字属于垃圾信息而被忽略 屏幕阅读器(是为视觉上有障碍的人设计的读取屏幕内容的程序)会忽略被隐藏的文字。 2. visibility: hidden ;的缺陷 这个大家应该比较熟悉就是隐藏的内容会占据他所应该占据物理空间 3.overflow:hidden;一个比较合理的方法 .texthidden { display:bl_如何视觉隐藏网页内容,只让它们在屏幕阅读器中可用?
文章浏览阅读1.1k次,点赞2次,收藏3次。在文章《Spring Cloud源码分析之Eureka篇第四章:服务注册是如何发起的 》的分析中,我们知道了作为Eureka Client的应用启动时,在com.netflix.discovery.DiscoveryClient类的initScheduledTasks方法中,会做以下几件事:周期性更新服务列表;周期性服务续约;服务注册逻辑;本章学习的是周期性服务续约的相关代码,对应用如..._eureka续约源码分析