完整版【系统学ES系列】请移步公号!

带着问题学习才高效

Term-level queries 与 Full text queries 的主要区别是什么?

Term-level queries 有哪些查询类型?运用场景有哪些?DSL如何书写?

Term-level queries 的各种查询对应到sql是怎样的

01 Term-level queries 简介

Term-level queries 术语级查询就是根据结构化数据中的精确值查找文档。与( Full text queries)全文查询的不同之处在于,术语级查询不会分析检索词,而是匹配存储在字段中的确切术语。不知道这是什么意思?没关系,下面TeHero结合实例进行讲解。

Term-level queries系列脑图

ps:上图的xmind文件获取方式见文末!

通过上图可以看到,Term-level queries 一共有11种查询类型,标红的四种查询是我们常用的查询:term query、terms query、range query、wildcard query。本文将先介绍:term query、terms query这两种查询!Let's Go!

02 数据准备

以博客的数据为例,数据结构如下:

创建blogs_index 和 tags_index(就是tag的详情):

PUT /blogs_index { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } }, "mappings": { "_doc": { "dynamic": false, "properties": { "id": { "type": "integer" }, "author": { "type": "keyword" }, "title": { "type": "text", "analyzer": "ik_smart" }, "tag":{ "type": "integer" }, "influence": { "type": "integer_range" }, "createAt": { "type": "date" } } } } } PUT /tags_index { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } }, "mappings": { "_doc": { "dynamic": false, "properties": { "id": { "type": "integer" }, "tag_name": { "type": "keyword" } } } } }

批量导入数据:

POST _bulk
{"index":{"_index":"blogs_index","_type":"_doc","_id":"1"}}
{"id":1,"author":"方才兄","title":"关注我,系统学编程"}
{"index":{"_index":"blogs_index","_type":"_doc","_id":"2"}}
{"id":2,"author":"方才","title":"系统学编程,关注我"}

03term query

核心点:检索词不会被分词,作为一个Token/term

3.1 通过实例理解

语句1:检索文档1的title字段的完整内容,发现居然检索不到文档!

POST /blogs_index/_doc/_search
{"query": {"term" : { "title" : "关注我,系统学编程" }}
}
语句2:只检索关键词“编程”,可以检索文档1和文档2
POST /blogs_index/_doc/_search
{
"query": {
"term" : { "title" : "编程" }
}
}

3.2 分析DSL执行过程

在【ElasticSearch系列05:倒排序索引与分词Analysis】我们已经知道了es的检索过程【ps:该过程非常重要,一定要掌握,明白了这个检索过程,对于理解DSL语句非常有用】:

  • 1)对于title字段,我们使用的是ik_smart分词,所以这5条文档,得到的PostingList的Token列表为【关注】【我】【系统学】【编程】【方才】【兄】;

  • 2)因为是term查询,所以语句1检索词的Token列表就是【关注我,系统学编程】;语句2检索词的Token列表为【编程】;

  • 3)在PostingList中检索,很明显语句1等价于sql语句【where Token = “关注我,系统学编程”】;语句2等价于sql语句【where Token = “编程”】。

  • 4)所以语句1检索不到结果,语句2是可以检索到文档1和文档2的。

ps:如何知道es中文档的PostingList呢?直接使用_anlyze接口分析即可:

GET blogs_index/_analyze
{
"text": [ "关注我,系统学编程"],
"field": "title"
}
得到针对字段title,建立的PostingList:
{
"tokens": [
{
"token": "关注",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "我",
"start_offset": 2,
"end_offset": 3,
"type": "CN_CHAR",
"position": 1
},
{
"token": "系统学",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 2
},
{
"token": "编程",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 3
}
]
}

3.3 与match query的对比

1、检索会被分词的字段,match语句与term语句区别较大。

match 语句1:检索文档1的title字段的完整内容,得到文档1和文档2;

POST /blogs_index/_doc/_search
{
"query": {
"match" : { "title" : "关注我,系统学编程" }
}
}

简单分析下:

  • 1)因为是match 查询,所以语句1检索词的Token列表就是【关注】【我】【系统学】【编程】;(注意和term查询时检索词的Token列表做对比【关注我,系统学编程】)

  • 2)在PostingList中检索,该语句等价于sql语句【where Token in (“关注”,"我","系统学","编程")】;

  • 3)所以可以检索到文档1和文档2。

2、检索不会分词的字段:mathc语句与term语句效果一致

POST /blogs_index/_doc/_search
{
"query": {
"term" : { "author" : "方才兄" }
}
}
POST /blogs_index/_doc/_search
{
"query": {
"match" : { "author" : "方才兄" }
}
}

注意:match语句会对检索词分词,使用的分词器默认与被检索字段一致【对于author这个字段,type为keyword,所以哪怕使用的是match查询,检索词依然不会被分词】。上述两个语句都只能检索到文档1!

3.4 term query 的使用场景

一般用于检索不会被分词的字段,主要是类型为:integer、keyword、boolean 的字段。比如说我们这个blogs_index中的author字段,假如我们只想看作者为“方才兄”的blog,DSL语句如下:

POST /blogs_index/_doc/_search
{
"query": {
"term" : { "author" : "方才兄" }
}
}

04 terms query

4.1 等价于mysql 的 in()

比如,我想检索作者是【方才兄】和【方才】的文章:

POST /blogs_index/_doc/_search
{
"query": {
"terms" : { "author" : ["方才兄","方才"]}
}
}

该语句等价于sql语句【where author in (“"方才兄","方才")】

4.2 Terms lookup mechanism——等价于mysql的联表查询

比如:有如下数据:

POST _bulk
{"index":{"_index":"blogs_index","_type":"_doc","_id":"3"}}
{"id":3,"author":"方才兄","title":"关注我,系统学编程","tag":[1,2,3]}
{"index":{"_index":"tags_index","_type":"_doc","_id":"1"}}
{"id":1,"tag_name":"这是标签1"}
{"index":{"_index":"tags_index","_type":"_doc","_id":"2"}}
{"id":2,"tag_name":"这是标签2"}
{"index":{"_index":"tags_index","_type":"_doc","_id":"3"}}
{"id":3,"tag_name":"这是标签3"}}

对于blogs_index中文档3,我们获取到了tag的idList集合,我们需要把tag的详细情况查出来:

GET /tags_index/_search
{
"query": {
"terms": {
"id": {
"index": "blogs_index",
"type": "_doc",
"id": "3",
"path": "tag"
}
}
}
}
参数解释:index:从中获取术语值的索引。type:从中获取术语值的类型。id:用于获取术语值的文档的ID,是源字段_id,而不是我们自定义的字段id。path:指定为获取terms过滤器实际值的路径的字段 。

使用场景:当需要terms语句包含大量术语时,从索引中的文档中获取这些术语值将是有益的。其实这种垮索引的查询方法,在实际中很难应用到,对数据结构有强制的要求,而且针对另一个index的查询条件,只能是 _id = xx,不能像sql一样随意书写where条件。

上述DSL语句等价于将sql语句【select * from tags_index where id in (1,2,3)】转化为了sql【select * from tags_index where id in (select tag from blogs_index where _id = 3)】。

下期预告:Term-level queries剩下的9种查询

●ES系列01:如何系统学习ES

●ES系列05:倒排序索引与分词Analysis

●ES系列07:match_phrase与match_phrase_prefix query

你点的每个赞我都认真当成了喜欢

ES系列09:基于词项的搜索 之 Term/Terms query相关推荐

  1. Elasticsearch中基于词项的搜索

    为了方便我们学习,我们导入kibana为我们提供的范例数据. 目前为止,我们已经探索了如何将数据放入Elasticsearch,现在来讨论下如何将数据从Elasticsearch中拿出来,那就是通过搜 ...

  2. laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索

    es的核心功能就是搜索和分析.那么我们看看搜索相关内容 1.搜索机制 在进入搜索之前,会对查询体根据情况进行分析和处理. 2.有哪些常用搜索类型 全文查询 词项查询 复合查询 嵌套查询 位置查询 特殊 ...

  3. 白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化

    文章目录 terms概述 准备数据 小例子 搜索articleID为KDKE-B-9947-#kL5或QQPX-R-3956-#aD8的帖子 搜索tag中包含java的帖子 优化搜索结果,仅仅搜索ta ...

  4. 橘子学ES19之词项搜索全文检索

    在ES中,词项搜索也叫term搜索,term就有词项的意思.词项检索的意思就是说我输入一个词汇,在检索的时候不会把你输入的这个词汇做分词,匹配条件就是完整的输入的词汇,但是文档插入的时候该分词还是分词 ...

  5. 计算机应用技术 自然语言处理,基于词联接的自然语言处理技术及其应用研究-计算机应用技术专业论文.docx...

    中文摘要摘 中文摘要 摘要 随着人类社会信息化程度和计算机软硬件水平的提高,自然语言处理(Natural LanguageProcessing,简称NLP)技术逐渐成为计算机应用和人工智能研究的热点, ...

  6. WWW 2020 | 信息检索中基于上下文的文本词项权重生成

    ©PaperWeekly 原创 · 作者|金金 单位|阿里巴巴研究实习生 研究方向|推荐系统 本文由卡耐基梅隆大学发表于 WWW 2020,介绍了基于上下文的文本词项权重生成方法 HDCT.原有的搜索 ...

  7. 自然语言处理--词向量使用基于 Annoy 的高级索引(近似最近邻)来查找最近邻词项

    我们可以使用 Annoy 对 word2vec 向量建立索引并将其结果与 gensim 的 KeyedVectors索引进行对比( 像 Annoy 这样的局部敏感哈希使潜在语义索引成为现实): fro ...

  8. 使用OpenCV与sklearn实现基于词袋模型的图像分类预测与搜索

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 基于OpenCV实现SIFT特征提取与BOW(Bag of Wor ...

  9. es基于completion suggest实现搜索提示

    在之前的某一篇中,我们使用了es的前缀搜索,获得了文档根据前缀进行匹配的效果,如下图所示, 下面说说在es中的另一种实现搜索提示的功能,基于completion suggest 进行实现,其在实际应用 ...

最新文章

  1. 数据库内核月报 - 2015 / 11-MySQL · 社区见闻 · OOW 2015 总结 MySQL 篇
  2. Java执行字符串中的运算公式
  3. spring boot使用freemarker页面获取系统路径最简配置
  4. java解析xml转为Map
  5. 中石油训练赛 - Isomorphic Inversion(哈希+贪心)
  6. 《剑指offer》反转链表
  7. Android高效开发:
  8. java 单例设计_Java 之单例设计模式
  9. 数据结构与算法(6) -- heap
  10. [mooc]open course on github
  11. yyuc视图未更新,控制器修改可以看到,视图无法更新,提示Allowed memory size of exhausted
  12. 家用计算机中PCB板材质,介绍PCB电路板的主要原材料
  13. 怎么提高程序的可修改性
  14. 从零开始:微信小程序新手入门宝典
  15. 计算机加密防止文件外泄,电脑文档加密系统哪个好?文档加密软件如何防止文件流通使用泄密...
  16. 计算机硕士非全日制的有双证吗,双证非全日制太坑了?非全日制研究生有哪些优势?...
  17. 光伏组件机器视觉新突破!维视智造上线汇流带引线焊接检测新方案 “误检率”低至0.01%
  18. 基于DBSCAN的学生月上网时间聚类
  19. selenium抓取页面表格
  20. 快播团队悄然崛起:连获2大奖,业内充分肯定,抢先布局千亿市场

热门文章

  1. 爱德曼报告指出,中国的整体信任度高达83,在所有被调查国家中全球排名第一 | 美通社头条...
  2. 关于Lodop的使用场景浅谈
  3. 手机玻璃盖板检测行业领跑者
  4. 爬虫手册04 Splash的使用
  5. [C1进阶之路-Web基础] 转义字符
  6. css常用选择器:相邻兄弟选择器(+)、子选择器(>)、兄弟选择器(~)、属性选择器等用法
  7. 重磅开源!屠榜各大CV任务!最强骨干网络:Swin Transformer来了
  8. Unity Ragdoll的坑
  9. Coming soon....
  10. EditText的imeOptions属性的设置