Elasticsearch系列(5):深入搜索
结构化搜索
结构化搜索是指搜索那些具有内置结构数据的过程,比如日期,时间和数字都是结构化的,它们有精确的格式,我们可以对这些格式进行逻辑操作,比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。
在结构化搜索中,我们得到的结果总是非是即否,要么存在于集合之中,要么存在于集合之外,结构化查询不关心文件的相关度或评分,它简单的对文档包括或排除处理。
这在逻辑上是能说通的,因为一个数字不能比其它数字更适合存在于某个相同的范围,结果只能是:存在于范围之中,抑或反之,同样,对于结构化文本来说,一个值要么相等,要么不相等,没有更似这种概念。
当进行精确值搜索时,我们会使用过滤器(filter),过滤器很重要,因为它们执行速度非常快,不会计算相关度(直接跳过了整个评分阶段)而且很容易被缓存,所以,要尽可能多的使用过滤器搜索。
一,精确值搜索
说到精确值搜索,一定会使用到term查询,它可以处理数字(number),日期(date),布尔值(bool)和文本(text)。
1,term查询数字
比如,我要查询价格为20元的所有产品,我们可以使用term查询来实现需求,查询语句为:
GET /my_store/products/_search
{
"query": {
"term": {
"price": {
"value": "20"
}
}
}
}
通常当查找一个精确值的时候,我们不希望对查询进行评分计算,只希望对文档进行包括或排除的计算,所以我们会使用constant_score查询以非评分模式进行term查询并以1作为统一评分,使用constant_score之后的查询语句为:
GET /my_store/products/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"price": "20"
}
}
}
}
}
从以上查询语句可以总结出:
- 通常使用constant_score将term查询转化为过滤器filter。
- 查询置于filter语句内还进行评分和相关度的计算,所有的结果都会返回一个默认的评分1。
2,term查询文本
term查询文本和查询数字一样容易,比如,我们要查询ID为’XHDK-A-1293-#fJ3’的产品,查询语句为:
GET /my_store/products/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"productID": "XHDK-A-1293-#fJ3"
}
}
}
}
}
注意:
如果文本中带有元字符(比如连字符-和哈希符#),默认是查询不出任何结果的,原因是索引数据的方式不同,productID被拆分成了多个更小的token。为了避免这种问题,我们需要告诉es该字段具有精确值,要将其设置成not_analyzed无需分析的,再去查询就能得到正确的结果了。
二,组合过滤器
前面的例子都是单个过滤器(filter)的使用方式,但是在实际业务场景中,我们很有可能会过滤多个值或字段,这个时候就会用到布尔过滤器。
1,布尔过滤器
一个bool过滤器由三个部分组成:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
must:表示所有的语句都必须匹配,相当于sql里的and。
must_not:表示所有的语句都不能匹配,相当于sql里的not。
should:表示至少有一个语句要匹配,相当于sql里的or。
注意:
一个bool过滤器的每个部分都是可选的,而且每个部分内容都可以只有一个或一组过滤器。
比如,我们要查询价格为20元同时productID为“XHDK-A-1293-#fJ3”,且价格不为30元的产品,使用布尔过滤器的查询语句为:
GET /my_store/products/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"price" : 20}},
{ "term" : {"productID" : "XHDK-A-1293-#fJ3"}}
],
"must_not" : {
"term" : {"price" : 30}
}
}
}
}
}
}
注意:
- 需要使用filtered查询将所有的东西包起来。
- 在should语句块里面的两个term过滤器与bool过滤器是父子关系,两个term条件需要匹配其一。
- 在must_not语句块里,如果一个产品的价格是30元,那么它会自动被排除,因为它处于must_not语句里面。
2,嵌套布尔过滤器
//filtered不被支持???
三,查找多个精确值
四,范围
五,处理NULL值
全文搜索
Elasticsearch系列(5):深入搜索的更多相关文章
- elasticsearch系列四:搜索详解(搜索API、Query DSL)
一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...
- Elasticsearch系列---结构化搜索
概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...
- Elasticsearch系列---深入全文搜索
概要 本篇介绍怎样在全文字段中搜索到最相关的文档,包含手动控制搜索的精准度,搜索条件权重控制. 手动控制搜索的精准度 搜索的两个重要维度:相关性(Relevance)和分析(Analysis). 相关 ...
- elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)
一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...
- Elasticsearch系列---多字段搜索
概要 本篇介绍一下multi_match的best_fields.most_fields和cross_fields三种语法的场景和简单示例. 最佳字段 bool查询采取"more-match ...
- ElasticSearch 2 (18) - 深入搜索系列之控制相关度
ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...
- ElasticSearch 2 (17) - 深入搜索系列之部分匹配
ElasticSearch 2 (17) - 深入搜索系列之部分匹配 摘要 到目前为止,我们介绍的所有查询都是基于完整术语的,为了匹配,最小的单元为单个术语,我们只能查找反向索引中存在的术语. 但是, ...
- ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...
- ElasticSearch 2 (15) - 深入搜索系列之多字段搜索
ElasticSearch 2 (15) - 深入搜索系列之多字段搜索 摘要 查询很少是简单的一句话匹配(one-clause match)查询.很多时候,我们需要用相同或不同的字符串查询1个或多个字 ...
- ElasticSearch 2 (14) - 深入搜索系列之全文搜索
ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...
随机推荐
- 记录 制作校园网登陆脚本 python编写 附源码
‘’‘ 首先我们分析一下 1.需要本机的IP 使用 socket 获取 2.需要向服务器提交的数据 构造请求数据 并分析数据可替换 3.检测登陆成功 检测登陆是否成功 ’‘’ 获取IP 这样会返回 本 ...
- ES5 常用 语法(object Arrary 函数绑定this指向)
ES object 扩展 ES object 扩展1. <!DOCTYPE html> <html> <head> <link rel="short ...
- java:找出占用CPU资源最多的那个线程
linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 1.先用top命令找出占用资源厉害的java进程id,如: 2 ...
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- 吴恩达机器学习笔记56-多元高斯分布及其在误差检测中的应用(Multivariate Gaussian Distribution & Anomaly Detection using the Multivariate Gaussian Distribution)
一.多元高斯分布简介 假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据.其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差 ...
- [Swift]LeetCode281. 之字形迭代器 $ Zigzag Iterator
Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...
- [Swift]LeetCode519. 随机翻转矩阵 | Random Flip Matrix
You are given the number of rows n_rows and number of columns n_cols of a 2D binary matrix where all ...
- Java面向对象特征之封装
package practice;/** * @功能 创建动物类,对动物的属性进行封装 * @author square 凉 * */public class Animal { /** * 动物姓名 ...
- 像素数据YUV简介与觉存储格式介绍
主要学习链接:博客园.51CTO 前言 照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了 ...
- python高级-动态特性(20)
一.动态语⾔的定义 动态语言是在运行时确定数据类型的语言.变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型.现在比较热门的动态语言有:Python.PHP.JavaScript.Obj ...