首页 > 其他分享 >Elastic intervals的使用

Elastic intervals的使用

时间:2024-03-12 20:30:29浏览次数:23  
标签:index Elastic content intervals 使用 query POST example match

在Elasticsearch中,intervals查询是用来做复杂的区间表达式匹配的,它可以基于分析过的文本字段执行一系列复杂的关系运算。intervals查询特别适合于那些需要对文本数据进行模式匹配,而不只是单一词汇匹配的情况。

intervals语法

GET your_index/_search
{
  "query": {
    "intervals": {
      "field_name": {
        "any_of": [ // any_of, all_of, none_of, one_of 是子查询类型
          {
            "match": { "query": "some text pattern" } // 匹配文本
          },
          {
            "range": { "gte": "lower_bound", "lte": "upper_bound" } // 区间范围匹配
          },
          // 其他子查询...
        ],
        "filter": { /* 可选的过滤条件 */ },
        "should_match": "all" // 或者 "at_least","none","at_most"
      }
    }
  }
}
GET your_index/_search
{
  "query": {
    "intervals": {
      "content": {
        "all_of": [
          { "match": { "query": "A" } },
          { "any_of": [{ "match": { "query": "B" } }, { "ordered": true }] }
        ]
      }
    }
  }
}

在上面的示例中,我们指示Elasticsearch在content字段中查找包含"A",并且紧随其后的任意位置有"B"的文档。

  • any_of: 这个条件表示只要满足所列出的一个或多个子查询即可
  • all_of: 这个条件表示必须满足所有列出的子查询
  • none_of: 通常通过must_not结构结合intervals实现,表示文档不应满足子查询列表中的任何条件。
{
  "intervals": {
    "content_field": {
      "range": {
        "gte": "start_word",
        "lte": "end_word",
        "ordered": true,
        "gap": 2 // 限制两个词汇间的最大单词数
      }
    }
  }
}
{
  "intervals": {
    "content_field": {
      "sequence": [
        { "match": { "query": "word1" } },
        { "match": { "query": "word2" } },
        { "match": { "query": "word3" } }
      ]
    }
  }
}
  • 用于匹配一个严格的词序序列,也就是说,文档中的词汇必须按照指定顺序出现。

案例

场景一

使用intervals查询找寻句子中“quick”和“dog”之间不超过两个单词的文档

索引创建
PUT /example_index
{
  "mappings": {
    "properties": {
      "sentence": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}
文档插入
POST /example_index/_doc
{
  "sentence": "The quick brown fox jumps over the lazy dog."
}

POST /example_index/_doc
{
  "sentence": "Red roses are blue violets are red."
}

POST /example_index/_doc
{
  "sentence": "The cat in the hat sat on the mat."
}
查询语句
GET /example_index/_search
{
  "query": {
    "intervals": {
      "sentence": {
        "all_of": [
          { "match": { "query": "quick" } },
          { "any_of": [{ "match": { "query": "dog" } }, { "ordered": true, "gap": 2 }] }
        ]
      }
    }
  }
}

场景二

使用intervals查询查找包含数字“3”到“7”的连续序列的文档

索引创建
PUT /example_index_numbers
{
  "mappings": {
    "properties": {
      "numbers": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }
}
文档插入
POST /example_index_numbers/_doc
{
  "numbers": "1 2 3 4 5 6 7"
}

POST /example_index_numbers/_doc
{
  "numbers": "8 9 10 11 12 13 14"
}

POST /example_index_numbers/_doc
{
  "numbers": "15 16 17 18 19 20 21"
}
查询语句
GET /example_index_numbers/_search
{
  "query": {
    "intervals": {
      "numbers": {
        "all_of": [
          { "match": { "query": "3" } },
          { "any_of": [{ "match": { "query": "7" } }, { "ordered": true, "gap": 1 }] }
        ]
      }
    }
  }
}

场景三

查询在职位描述中包含了“software”并且紧接着是“developer”的文档。

索引创建
PUT /example_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}
文档插入
POST /example_index/_doc
{
  "content": "John Doe is an engineer from New York working at XYZ Corp."
}

POST /example_index/_doc
{
  "content": "Jane Smith is a software developer based in California."
}

POST /example_index/_doc
{
  "content": "Michael Johnson works as a data scientist at ABC Inc. in Texas."
}

POST /example_index/_doc
{
  "content": "Sarah Brown is a product manager living in Illinois."
}

POST /example_index/_doc
{
  "content": "Emily Davis, an architect from Washington DC, joined XYZ Corp last year."
}

POST /example_index/_doc
{
  "content": "Robert Harris, who lives in Oregon, is a senior software engineer."
}

POST /example_index/_doc
{
  "content": "Jessica Wilson works in marketing for ABC Inc., located in Florida."
}
查询语句
GET /example_index/_search
{
  "query": {
    "intervals": {
      "content": {
        "all_of": [
          { "match": { "query": "software" } },
          { "any_of": [{ "match": { "query": "developer" } }, { "ordered": true, "gap": 0 }] }
        ]
      }
    }
  }
}

场景四

假设我们想要找出在文章内容中连续提到"prepare", “toppings”, "bake"这三个词的文章。

索引创建
PUT /blog-posts
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}
文档插入
POST /blog-posts/_doc
{
  "title": "How to make pizza from scratch",
  "content": "First, prepare the dough. Then add toppings like tomato sauce, mozzarella cheese, mushrooms, pepperoni, and bake it for 10 minutes at 425°F."
}

POST /blog-posts/_doc
{
  "title": "Best practices for gardening",
  "content": "Plant seeds, water regularly, fertilize when needed, prune dead branches, and enjoy the fruits of your labor."
}

POST /blog-posts/_doc
{
  "title": "Building a birdhouse",
  "content": "Cut wood to size, assemble pieces, attach roof, drill entrance hole, then hang the birdhouse in a suitable location."
}

查询语句
GET /blog-posts/_search
{
  "query": {
    "intervals": {
      "content": {
        "sequence": [
          { "match": { "query": "prepare" } },
          { "match": { "query": "toppings" } },
          { "match": { "query": "bake" } }
        ]
      }
    }
  }
}

标签:index,Elastic,content,intervals,使用,query,POST,example,match
From: https://blog.csdn.net/qq_29312279/article/details/136661604

相关文章

  • python singledispatch 使用简单说明
    singledispatch可以实现类似方法的范型能力,以下是使用的简单说明方法参考代码fromfunctoolsimportsingledispatch@singledispatchdefadd(a,b):returnf"default---{a}-{b}" @add.registerdef_(a:int,b:int)->int:returna+b......
  • git-revert的使用
    使用场景:release分支被其他分支错误的合并完代码之后,又有新分支将代码合并到release,需要去回滚某分支错误的合并请求1.基于release分支新建一个分支:release-revert命令:gitcheckoutrelease #切换到release分支gitcheckout-brelease-revert #创建并切换......
  • Python-使用openpyxl读取excel内容
    1.本篇文章目标将下面的excel中的寄存器表单读入并构建一个字典2.openpyxl的各种基本使用方法2.1打开工作簿wb=openpyxl.load_workbook('test_workbook.xlsx')2.2获取工作簿中工作表名字并得到工作表ws=wb[wb.sheetnames[0]]wb.sheetnames会返回一个列表,列表中......
  • XLSReadWriteII使用
    这是自带的一个例子,看懂这一点东西,基本的操作应该没问题了....unitMain;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,XLSReadWriteII4,XLSFonts4,CellFormats4,BIFFRecsII4;typeTfrmMain=class(TFo......
  • 【使用docker 搭建Java仓库 nexus 】
    yaml---apiVersion:apps/v1kind:StatefulSetmetadata:annotations:k8s.eip.work/displayName:Nexus服务k8s.eip.work/ingress:'false'k8s.eip.work/service:ClusterIPk8s.eip.work/workload:nexuslabels:k8s.eip.work/layer......
  • Avalona下AvaloniaEdit的使用
    安装3个包:Install-PackageAvalonia.AvaloniaEditInstall-PackageAvaloniaEdit.TextMateInstall-PackageTextMateSharp.Grammars在App.xaml的<Application.Styles>下增加:<StyleIncludeSource="avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml"......
  • 如何使用RunnerGo模拟用户分流负载
    在实际的软件使用过程中会有这样的一个情况:用户登录系统后通常会进行多样化的操作,涉及不同的功能模块,这实际上是对系统资源的一种分流负载。那么,我们如何有效地还原这种分流负载情况呢?今天给大家介绍RunnerGo的接口权重功能。通过配置接口权重,RunnerGo能够根据业务逻辑、系统压力......
  • Elasticsearch 如何保证写入过程中不丢失数据的
    丢失数据的本质在本文开始前,首先明白一个点,平时我们说的组件数据不丢失究竟是在指什么,如果你往ES写入数据,ES返回给你写入错误,这个不算数据丢失。如果你往ES写入数据,ES返回给你成功,但是后续因为ES节点重启或宕机导致写入的数据不见了,这个才叫数据丢失。简而言之,丢失数据的本质是E......
  • 使用Office的小伙伴一定要把这个打开!关键时候能保命
    使用电脑办公的小伙伴一定离不开Office。很多小伙伴在使用Office的时候,基本上都是双击打开对应的软件(Word/Excel/Powerpoint)就直接使用。这种直接打开之后就使用的习惯很不值得提倡。除非你要记录的东西是一分钟就能完成的。小白在企业上班的时候,经常会遇到同事在做文档......
  • 探索Flutter中的模糊毛玻璃滤镜效果:ImageFilter介绍使用和深入解析
    在Flutter中,模糊效果不仅可以增加应用的视觉吸引力,还可以用于多种场景,如背景模糊、图像处理等。通过BackdropFilter和ImageFilter.blur,Flutter使得添加和调整模糊效果变得异常简单。本文将深入探讨如何在Flutter中实现动态模糊效果,并通过TileMode参数调整模糊效果的边缘行为......