很多写说明文档,没有总结写开头。因为文档内容又很多,你看到后面就忘记前面,没有形成结构化知识。这样知识在大脑里是离散的,不完整,不准确的。

所以我的文章都是把结论写最开始,或者要说的全部内容用一句话写在最开始。你知道了可以不用看,不知道,可以一眼知道接下来学到什么。

当你看到后面,不记得前面了,回到最开始一句话,大脑就会统领全局,形成最准确和系统性的知识。

我们只能按大脑习惯的学习知识,不可违背大脑的习惯学习,不然只会事倍功半,甚至于学过就忘。

本文说是es的查询,分为:Query查询Filter查询、复合查询、聚合查询。

Query context 查询上下文 这种语句在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,_score 分数就越高

Filter context 过滤上下文 过滤上下文中的语句在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分

一、query查询

也就是你写dsl(es 查询语法语言)语句时,可以用的下一级字段例如 {"query":{"match":{}}}

1、match查询

match query: 知道分词器的存在,会对filed进行分词操作,然后再查询
match_all: 查询所有文档
multi_match: 可以指定多个字段
match_phrase: 短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词。

#1、 查询年龄为3的(命中:ID = 1)
GET student/_search
{
"query":{"match":{"age": 3}}
}#2、查询兴趣里包含'演戏'的 (命中 ID = 2,5,4)
GET student/_search
{"query":{"match":{"interests": "演戏"}}
}
#这里只要interests包含'演戏','演','戏'的都会命中#3、查询索引所有文档 (命中 ID = 1,2,3,4,5)
GET student/_search
{"query":{"match_all": {}}
}#4、查询name和address包含'德' (命中 ID = 2)
GET student/_search
{"query":{"multi_match": {"query": "德","fields":["name","address"]}}
}
#说明 这里文档ID为4的address为'德州',应该也包含'德',但却没有被命中,原因是我们索引结构中,address属性是一个keyword类型,它是需要完全匹配,而不是包含的关系。
#如果这里query为'德州'就可以命中2条数据。#5、查询兴趣里包含'演员'的 (命中 无)
GET student/_search
{"query":{"match_phrase":{"interests": "演员"}}
}
# 这里和match的区别是这里是真正包含'演员',而不是只要满足其中一个字就会被模糊命中

2、term查询和terms查询

term query: 会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date

term:查询某个字段为该关键词的文档(它是相等关系而不是包含关系)

terms:查询某个字段里含有多个关键词的文档

#1、查询地址等于'香港'的文档 (命中:ID = 2,5)
GET student/_search
{"query":{"term":{ "address":"香港"}}
}
#如果仅检索'香'那是无法命中的,因为keyword需要完全匹配才能命中#2、查询地址等于"香港"或"北京"的 (命中: ID =2,3,5)
GET student/_search
{"query":{"terms":{"address":["香港","北京"]}}
}

3、 范围查询

range: 实现范围查询

   include_lower: 是否包含范围的左边界,默认是true

   include_upper: 是否包含范围的右边界,默认是true

#2、查询年纪18到28 (命中 ID = 2,3)
GET student/_search
{"query": {"range": {"age": {"from": 18,"to": 28,"include_lower": true,"include_upper": true}}}
}

4、wildcard查询

允许使用通配符* 和 ?来进行查询
* 代表0个或多个字符
? 代表任意一个字符

#1、查询姓名'徐'开头的 (命中 ID = 1)
GET student/_search
{"query": {"wildcard": {"name": "徐*"}}
}

5、fuzzy实现模糊查询

模糊查询可以在Match和 Multi-Match查询中使用以便解决拼写的错误,模糊度是基于Levenshteindistance计算与原单词的距离。使用如下:

GET student/_search
{"query": {"fuzzy": {"interests": {"value": "演" }}}
}

二、Filter查询

filter是不计算相关性的,同时可以cache。因此,filter速度要快于query

#1、获取年龄为3的 (命中 ID = 1)
GET student/_search
{ "post_filter":{"term":{"age": 3}}
}#2、查询年纪为3或者63的 (命中 ID = 1,4)
GET student/_search
{ "post_filter":{"terms":{"age":[3,63]}}
}

三、复合查询

bool query(布尔查询)、boosting query(提高查询)、constant_score(固定分数查询)、dis_max(最佳匹配查询)、function_score(函数查询)

1.布尔查询 "query":"bool"

# must:    必须匹配。贡献算分
# must_not:过滤子句,必须不能匹配,但不贡献算分
# should:  选择性匹配,至少满足一条。贡献算分
# filter:  过滤子句,必须匹配,但不贡献算分 在filter元素下指定的查询对评分没有影响 , 评分 返回为0。分数仅受已指定查询的影响。POST _search
{"query": {"bool" : {"must" : {"term" : { "user" : "kimchy" }},"filter": {"term" : { "tag" : "tech" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tag" : "wow" } },{ "term" : { "tag" : "elasticsearch" } }],"minimum_should_match" : 1,"boost" : 1.0}}
}

2、提高查询 boosting query

在上面的复合查询我们可以通过must_not+must 先剔除不想匹配的文档,再获取匹配的文档,但是有一种场景就是我并不需要完全剔除,而是把需要剔除的那部分文档的分数降低。

# 通过Boosting的方式,将3的记录也纳入结果集,只是排名会靠后。(结果 1->2->3)
POST news/_search
{"query": {"boosting": {"positive": {"match": {"content": "apple"}},"negative": {"match": {"content": "pie"}},"negative_boost": 0.5}}
}"""
说明boosting需要搭配三个关键字 positive , negative , negative_boost只有匹配了 positive查询 的文档才会被包含到结果集中,但是同时匹配了negative查询 的文档会被降低其相关度,通过将文档原本的_score和negative_boost参数进行相乘来得到新的_score。因此,negative_boost参数一般小于1.0。在上面的例子中,任何包含了指定负面词条的文档的_score都会是其原本_score的一半。"""
就是说就算文档包含了苹果,但因为包含了树或者水果那么我们也会过滤这条文档信息,因为我们要查的苹果公司相关信息,如果你是苹果树那对我来讲确实是不匹配,所以直接过滤掉,看是没啥问题。但是你想,这样做是不是太粗暴了,因为一个文档中包含'苹果'和'树'那不代表一定是苹果树,而可能是 '苹果公司组织员工一起去种树' 那么这条文档理应出现而不是直接过滤掉,所以我们就可以用boosting query。就像上面这个例子一样。

3、最佳匹配

dis_max : 只是取分数最高的那个query的分数而已。

GET /_search
{"query": {"dis_max" : {"queries" : [{ "term" : { "title" : "Quick pets" }},{ "term" : { "body" : "Quick pets" }}],"tie_breaker" : 0.7}}
}
"""
假设一条文档的'title'查询得分是 1,'body'查询得分是1.6。那么总得分为:1.6+1*0.7 = 2.3。如果我们去掉"tie_breaker" : 0.7 ,那么tie_breaker默认为0,那么这条文档的得分就是 1.6 + 1*0 = 1.6
"""

四、function_score(函数查询)

向量搜索的计算余弦相似度,就可以用到

{"query": {"script_score": {"query": {"bool":{"must":[{"match": {"org_id": org_id}},{"match": {"type_": type_}},{"match": {"bot_id": bot_id}}],"filter": {"exists": {"field": "sentence_vec"}}}},"script": {"source": "cosineSimilarity(params.queryVector, 'sentence_vec')+1.0","params": {"queryVector": sentence_vector}}}}}

 

ES(elasticsearch)查询或搜索总结相关推荐

  1. es(elasticsearch)查询数据出现异常Result window is too large, from + size must be less than or equal to

    今天使用es查询数据时出现异常: Result window is too large, from + size must be less than or equal to: [10000] but ...

  2. es查询语句拼接 java_JAVA使用ElasticSearch查询in和not in的实现方式

    JAVA使用ElasticSearch查询in和not in的实现方式 发布时间:2020-08-22 16:03:11 来源:脚本之家 阅读:119 作者:执笔记忆的空白 ElasticSearch ...

  3. Elasticsearch(es) 查询语句语法详解

    Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL.Elasticsearch 查询分类大致分为全文查询.词项查询.复合查 ...

  4. elasticsearch(es)高级查询api

    yml配置 #es配置 spring:elasticsearch:rest:uris: 192.168.16.188:9200 添加依赖 <dependency><groupId&g ...

  5. es ik 多字段查询_SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询...

    背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...

  6. ElasticSearch - 玩转搜索之花式查询

    文章目录 ElasticSearch - 玩转搜索之花式查询 1.term的多种查询 1.1 索引以及数据准备 1.2 term精准匹配查询 1.3 Exist非空值文档查询 1.4 Prefix前缀 ...

  7. ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll

    文章目录 01. 数据准备 02. ElasticSearch 如何查询所有文档? 03. ElasticSearch 如何指定搜索结果的条数? 04. ElasticSearch 分页查询方式有哪些 ...

  8. 【Elasticsearch】改进布尔查询的搜索相关性

    1.概述 翻译:Improving search relevance with boolean queries 有人翻译:Elasticsearch:使用布尔查询提高搜索的相关性 当你在Elastic ...

  9. elasticsearch的rest搜索--- 查询

    目录: 一. 针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 四. 查询 1. 查询的官网的文档 ...

最新文章

  1. Elasticsearch官档翻译——2 2 在Linux上启动服务
  2. oracle--pl/sql变量定义----
  3. HSIPAW(昔卜)
  4. 第十七部分-Python文档和测试
  5. webpack初体验
  6. Pycharm用鼠标滚轮控制字体大小
  7. 还在用 Notepad++吗? 盘点五款更好用的文本编辑器
  8. 一文彻底搞懂静态库和动态库,显示链接和隐式链接
  9. 征稿 | Call for papers on Knowledge Graphs
  10. java判断两个时间区间是否有重合
  11. 从多路搜索树到 B-树
  12. 人件第二版(中文版)pdf
  13. 【C练习】两个已经从小到大的数组合并成为一个从小到大排序的数组
  14. 会员功能竞品分析(一):唯品会、京东、苏宁易购
  15. android studio链接海马玩模拟器
  16. 洛谷P6685 可持久化动态仙人掌的直径问题
  17. 7z001怎么解压在安卓手机上面_手机存储告急怎么办?这份安卓清理指南请收好...
  18. Chapter4.4:综合实例
  19. python adf检验_python做adf检验
  20. 通过XManager5连接Linux操作系统,安装Eclipse工具,进行代码开发、测试

热门文章

  1. python上手度_Python快速上手JSON指南
  2. 区块链和智能投顾结合的思考
  3. geotrellis框架sbt转投maven构建
  4. 与计算机科学与技术相似的专业,【选专业】名称相似但实际千差万别的专业 谨防掉坑!...
  5. 登录验证过程,PC与APP开放登录接口(支持WEB与SDK方式)
  6. DedeCMS创始人林学先生(IT柏拉图)因罹患癌症逝世
  7. 【无标题】数学实验 慕课答案 第一节
  8. 南华工商学院计算机,南华工商学院清远校区
  9. 怎样在线生成gif动图?如何将png转换gif动图?
  10. golang数据结构初探之iota