elasticsearch搜索功能(二)

news2024/11/17 20:47:53

一、DSL查询文档(P100)

1. DSL查询分类

Elasticsearch提供了基于JSON的DSL(Domain Specific  Language)来定义查询。常见的查询类型包括:

(1)查询所有:查询出所有数据,一般测试用。例如:match_all

(2)全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

1️⃣match_query

2️⃣multi_match_query

(3)精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

1️⃣ids

2️⃣range

3️⃣term

(4)地理(geo)查询:根据经纬度查询。例如:

1️⃣geo_distance

2️⃣geo_bounding_box

(5)复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:

1️⃣bool

2️⃣function_score

查询的基本语法如下:

GET /indexName/_search
{
  "query": {
    "查询类型": {
      "查询条件": "条件值"
    }
  }
}
// 查询所有
GET /indexName/_search
{
  "query": {
    "match_all": {
    }
  }
}

2. 全文检索查询

全文检索查询,会对用户输入内容分词,常用于搜索框搜索

match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:

GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

multi_match:与match查询类似,只不过允许同时查询多个字段,语法:

GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    }
  }
}

3. 精准查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

(1)term:根据词条精确值查询(根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段)

(2)range:根据值的范围查询(根据数值范围查询,可以是数值、日期的范围)

term查询:    

// term查询
GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

range查询:

// range查询
GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

4. 地理坐标查询

根据经纬度查询。常见的使用场景包括:

(1)携程:搜索我附近的酒店

(2)滴滴:搜索我附近的出租车

(3)微信:搜索我附近的人

根据经纬度查询

例如: geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档

// range查询
GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

  

根据经纬度查询,

geo_distance:查询到指定中心点小于某个距离值的所有文档

// geo_distance 查询
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "FIELD": "31.21,121.5"
    }
  }
}

5. 复合(compound)查询

复合查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:

(1)fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价

5.1 相关性算分

当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。 例如,我们搜索 "虹桥如家",结果如下:

[
  {
    "_score" : 17.850193,
    "_source" : {
      "name" : "虹桥如家酒店真不错",
    }
  },
  {
    "_score" : 12.259849,
    "_source" : {
      "name" : "外滩如家酒店真不错",
    }
  },
  {
    "_score" : 11.91091,
    "_source" : {
      "name" : "迪士尼如家酒店真不错",
    }
  }
]

elasticsearch中的相关性打分算法是什么?

(1)TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大

(2)BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平

5.2 复合查询 Function Score Query

使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。

案例:给“如家”这个品牌的酒店排名靠前一些

把这个问题翻译一下,function score需要的三要素:

(1)哪些文档需要算分加权? 品牌为如家的酒店

(2)算分函数是什么? weight就可以

(3)加权模式是什么? 求和

GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {// ... },
      "functions": [ // 算分函数
        {
          "filter": { // 满足的条件,品牌必须是如家
            "term": {
              "brand": "如家"
            }
          },
          "weight": 2 // 算分权重为2
        }
      ],
      "boost_mode": "sum"
    }
  }
}

5.3 复合查询 Boolean Query

布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

(1)must:必须匹配每个子查询,类似“与”

(2)should:选择性匹配子查询,类似“或”

(3)must_not:必须不匹配,不参与算分,类似“非”

(4)filter:必须匹配,不参与算分

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "上海" }}
      ],
      "should": [
        {"term": {"brand": "皇冠假日" }},
        {"term": {"brand": "华美达" }}
      ],
      "must_not": [
        { "range": { "price": { "lte": 500 } }}
      ],
      "filter": [
        { "range": {"score": { "gte": 45 } }}
      ]
    }
  }
}

案例:利用bool查询实现功能

需求:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {"name": "如家"}
        }
      ],
      "must_not": [
        {
          "range": { "price": {"gt": 400}}
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km", "location": {"lat": 31.21, "lon": 121.5}
          }
        }
      ]
    }
  }
}

二、搜索结果处理

1. 排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // 排序字段和排序方式ASC、DESC
    }
  ]
}
GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance" : {
          "FIELD" : "纬度,经度",
          "order" : "asc",
          "unit" : "km"
      }
    }
  ]
}

2. 分页

elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。

elasticsearch中通过修改from、size参数来控制要返回的分页结果:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990, // 分页开始的位置,默认为0
  "size": 10, // 期望获取的文档总数
  "sort": [
    {"price": "asc"}
  ]
}

 

2.1 深度分页问题

ES是分布式的,所以会面临深度分页问题。例如按price排序后,获取from = 990,size =10的数据:

(1)首先在每个数据分片上都排序并查询前1000条文档。

(2)然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档

(3)最后从这1000条中,选取从990开始的10条文档

 

如果搜索页数过深,或者结果集(from + size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000

针对深度分页,ES提供了两种解决方案:

(1)search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。

(2)scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用。

3. 高亮

高亮:就是在搜索结果中把搜索关键字突出显示。

原理是这样的:

(1)将搜索结果中的关键字用标签标记出来

(2)在页面中给标签添加css样式

语法:

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}

搜索结果处理整体语法:

GET /hotel/_search
{
  "query": {
    "match": {
      "name": "如家"
    }
  },
  "from": 0, // 分页开始的位置
  "size": 20, // 期望获取的文档总数
  "sort": [ 
    {  "price": "asc" }, // 普通排序
    {
      "_geo_distance" : { // 距离排序
          "location" : "31.040699,121.618075", 
          "order" : "asc",
          "unit" : "km"
      }
    }
  ],
  "highlight": {
    "fields": { // 高亮字段
      "name": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}

三、RestClient查询文档

1. 快速入门

 

 

RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,其中包含了查询、排序、分页、高亮等所有功能:

RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法:

 

2. 全文检索查询(P112)

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。 同样是利用QueryBuilders提供的方法:

match查询 精确查询 复合查询 排序、分页、高亮

 

四、黑马旅游案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 9 章 答案

《Python程序设计&#xff08;第3版&#xff09;》[美] 约翰策勒&#xff08;John Zelle&#xff09; 第 9 章 答案 答案仅供参考&#xff0c;若有错误欢迎指正 判断对错 计算机可以生成真正的随机数。Python 的 random 函数返回伪随机整数。自顶向下的设计也称为逐步求精。…

Redis优惠券秒杀 | 黑马点评

目录 一、全局唯一ID 1、全局ID生成器 二、实现秒杀下单 1、基本的下单功能 2、超卖问题 3、乐观锁解决并发问题 三、实现一人一单 1、思路分析 2、代码初步实现 3、关于锁的范围 4、关于事务失效 5、集群下线程并发问题 一、全局唯一ID 订单如果用自增长会存在…

QT动画实例代码QPropertyAnimation的应用

用QT实现动画&#xff0c;我们必定用到QPropertyAnimation&#xff0c;这里我们介绍几种情形的动画实现。如直线动画&#xff0c;曲线动画&#xff0c;路径动画。 一、基础知识 1、QPropertyAnimation的初始化 我们首先必须在包涵QPropertyAnimation的头文件或者模块&#x…

Android之WorkManager处理后台定时任务

WorkManager和Service并不相同&#xff0c;也没有直接的联系。Service是Android系统四大组件之一&#xff0c;它没有被销毁的情况下是一直保持在后台运行的。而WorkManager只是一个处理定时任务的工具&#xff0c;它可以保证即使在应用退出甚至手机重启的情况下&#xff0c;之前…

动手深度学习-pytorch数据操作

N维数组是机器学习和神经网络的主要数据结构创建数组需要形状&#xff1a;如3*4的矩阵每个元素的类型&#xff1a;例如32位浮点数每个元素的值&#xff1a;例如全是0.或者随机数数据操作首先&#xff0c;导入torch张量表示一个数值组成的数组&#xff0c;这个数组可能有多个维度…

acwing基础课——欧拉函数

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想&#xff1a; 这里我们了解一下欧拉函数是什么以及用筛法求欧拉函数&#xff0c;我们先给出欧拉函数的定义&#xff1a; 然后我们了解一下互质的概念&#xff0c;只要两数的公因…

连你女朋友都能看懂的分布式架构原理!

目录 从一个新闻门户网站案例引入推算一下你需要分析多少条数据&#xff1f;黄金搭档&#xff1a;分布式存储分布式计算 这篇文章聊一个话题&#xff1a;什么是分布式计算系统&#xff1f; 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词&#xff0c;比如分…

CSDN官方模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

数据结构(栈)

目录 栈的定义 形象比喻 栈的相关术语 栈的抽象数据类型&#xff08;栈Stack的ADT&#xff09; 顺序栈 顺序栈类的声明 顺序栈类成员函数的实现 基本效率分析 顺序栈的应用&#xff08;小测试&#xff09; main.cpp 共享栈 双共享栈 链式栈 链式栈基本操作分析 链…

cf Educational Codeforces Round 134 E. Prefix Function Queries

原题&#xff1a; You are given a string s, consisting of lowercase Latin letters. You are asked q queries about it: given another string t, consisting of lowercase Latin letters, perform the following steps: concatenate s and t; calculate the prefix func…

实战打靶集锦-001-Funbox2

**写在前面&#xff1a;**这应该是本人第一次自主成功完成的打靶&#xff0c;纪念一下下。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 浏览器访问4.1.2 站点地图查看4.1.3 目录枚举4.1.4 公共EXP搜索4.2 FTP探查4.2.1 手工登录FTP4.2.2 公共EXP搜索…

基于决策树模型和支持向量机模型的手写数字识别

目录 1、导入库和手写数字数据集 2、 把数据可视化 3、把数据分成训练数据集和测试数据集 4、训练SVM模型 5、训练决策树模型 6、对所使用的模型进行评估 7、对手写数字图像进行预测 本项目实现了 第一个功能&#xff1a;可以通过导入库和数据集、通过对数据集的预处理…

JavaScript基础(17)_Function方法(call、apply)、arguments

概念 call&#xff0c;apply都属于Function.prototype的一个方法&#xff0c;它是JavaScript引擎内在实现的&#xff0c;因为属于Function.prototype&#xff0c;所以每个Function对象实例(就是每个方法)都有call&#xff0c;apply属性&#xff0c;可以通过函数对象来调用。 a…

2023牛客寒假算法基础集训营3 赛时思路+正解

这场数学和思维偏多&#xff0c;特别是数学&#xff0c;五个小时过于充实了&#xff0c;而且更加考验你的心态。 这场不乏码量大的毒瘤题&#xff0c;也不乏人类智慧妙妙题。 A 不断减损的时间 题意 给定一个数组aaa&#xff0c;我们可以执行任意次操作&#xff0c;该操作定义…

Rethinking Performance Gains in Image Dehazing Networks

论文源码&#xff1a;https://download.csdn.net/download/zhouaho2010/87393184 Abstract 图像去雾是低层视觉中的一个活跃话题&#xff0c;随着深度学习的快速发展&#xff0c;许多图像去雾网络被提出。尽管这些网络的工作良好&#xff0c;但提高图像去雾性能的关键机制仍不…

守望者的逃离

题目说明【问题描述】恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵&#xff0c;率深藏在海底的那加企图叛变&#xff1a;守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛很快就会沉下去&#…

【java入门系列五】java基础-面向对象**

学习记录&#x1f914;类与对象内存中的布局堆栈成员方法 类内的函数传参机制传进来的是一个数组/对象&#xff0c;类似于py的list调用递归-在栈空间方法递归汉诺塔八皇后方法重载overload可变参数作用域**scope构造器/构造方法&#xff1a;新对象的初始化构造器细节对象创建流…

pytorch 笔记:torch.nn.init

这个模块中的所有函数都是用来初始化神经网络参数的&#xff0c;所以它们都在torch.no_grad()模式下运行&#xff0c;不会被autograd所考虑。 1 计算gain value 1.1 介绍 这个在后面的一些nn.init初始化中会用到 1.2 用法 torch.nn.init.calculate_gain(nonlinearity, para…

【LeetCode】回溯算法总结

回溯法解决的问题 回溯法模板 返回值&#xff1a;一般为void参数&#xff1a;先写逻辑&#xff0c;用到啥参数&#xff0c;再填啥参数终止条件&#xff1a;到达叶子节点&#xff0c;保存当前结果&#xff0c;返回遍历过程&#xff1a;回溯法一般在集合中递归搜索&#xff0c;集…

使用DiskGenius进行硬盘数据迁移

克隆硬盘 - DiskGenius 1.迁移磁盘 选择自己想要迁移的磁盘&#xff0c;点击工具-克隆磁盘 首先选择源硬盘&#xff0c;点击确定 之后选择想要迁移到的硬盘&#xff0c;点击确定 检查一下原硬盘和目标硬盘是否正确&#xff0c;此外还可以对这个空间进行二次调整。最终如果没有…