es之搜索详解

article/2025/8/28 5:02:30

Elasticesearch的核心功能是搜索,现在介绍ES的搜索API及其用法。

为了有助于讲解,这里准备一些测试数据,把数据保存到文件website.json中:

 

{"index":{"_index":"website","_id":"1"}}

{"address":"北京市昌平区南丰路","province":"北京市","city":"北京市","district":"昌平区","location":"40.150775,116.2841456","title":"凤凰自行车","category":["购物","自行车专卖"]}

{"index":{"_index":"website","_id":"2"}}

{"address":"北京市昌平区 ","province":"北京市","city":"北京市","district":"昌平区","location":"40.109854,116.274349","title":"速派奇","category":["购物","其它购物"]}

{"index":{"_index":"website","_id":"3"}}

{"address":"北京市昌平区 ","province":"北京市","city":"北京市","district":"昌平区","location":"40.165716,116.270237","title":"共享单车停放处","category":["生活服务","其它生活服务"]}

{"index":{"_index":"website","_id":"4"}}

{"address":"北京市昌平区X030","province":"北京市","city":"北京市","district":"昌平区","location":"40.16806,116.32344","title":"昌平公共自行车存车处","category":["生活服务","其它生活服务"]}

{"index":{"_index":"website","_id":"5"}}

{"address":"北京市昌平区百沙路","province":"北京市","city":"北京市","district":"昌平区","location":"40.149193,116.28929","title":"共享单车停放处","category":["生活服务","其它生活服务"]}

{"index":{"_index":"website","_id":"6"}}

{"address":"北京市昌平区北七家镇白庙村200号","province":"北京市","city":"北京市","district":"昌平区","location":"40.10261,116.38784","title":"绿源奥顺通物流销售门店","category":["购物","自行车专卖"]}

{"index":{"_index":"website","_id":"7"}}

{"address":"北京市昌平区北七家镇白庙中街200号","province":"北京市","city":"北京市","district":"昌平区","location":"40.1026,116.38751","title":"新日电动车(北清路店)","category":["购物","自行车专卖"]}

{"index":{"_index":"website","_id":"8"}}

{"address":"北京市昌平区北七家镇白庙村中街往西50米202号","province":"北京市","city":"北京市","district":"昌平区","location":"40.102558,116.387483","title":"都市风电动车(北清路店)","category":["购物","自行车专卖"]}

{"index":{"_index":"website","_id":"9"}}

{"address":"北京市昌平区小汤山镇小汤山马坊村小汤山中心马坊小学附近","province":"北京市","city":"北京市","district":"昌平区","location":"40.1547354,116.40153086","title":"雅迪电动车(马坊店)","category":["购物","自行车专卖"]}

{"index":{"_index":"website","_id":"10"}}

{"address":"北京市昌平区东北路附近","province":"北京市","city":"北京市","district":"昌平区","location":"40.134651,116.433778","title":"雅迪电动车","category":["购物","自行车专卖"]}

 

创建索引并设置settings和mapping,指定索引名为website,副本数为1,分片数为3,命令如下:

 

{

"settings": {

"number_of_shards": 3,

"number_of_replicas": 1

},

"mappings": {

"properties": {

"address": {

"type": "text"

},

"category": {

"type": "keyword"

},

"city": {

"type": "keyword"

},

"district": {

"type": "keyword"

},

"location": {

"type": "geo_point"

},

"province": {

"type": "keyword"

},

"title": {

"type": "text"

}

}

}

}

最后执行bulk批量导入命令把文档导入ES:

 

$curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' --data-binary @website.json

1

1. 搜索机制

1.1 查询所有数据

GET website/_search

{

"query":{

"match_all":{}

}

}

也可以写成:

 

GET website/_search

1

1.2 指定返回字段

默认情况下返回结果包含文档的所有字段信息。也可以指定返回某些字段。

 

GET website/_search

{

"_source":["title","city"],

"query":{

"term":{

"city":"北京市"

}

}

}

java示例如下:

 

SearchSourceBuilder builder = new SearchSourceBuilder();

//指定返回的字段

String[] includes = {"title","city"};

//排除返回的字段

String[] excludes = {};

builder.fetchSource(includes,excludes);

1.3 指定返回版本号

GET website/_search

{

"version":true,

"query":{

"term":{

"city":"北京市"

}

}

}

java示例如下:

 

SearchSourceBuilder builder = new SearchSourceBuilder();

builder.version(true);

1.4 过滤低频分数据

ES提供了最小评分的过滤机制,可以使用这个过滤掉评分比较低的数据。

 

GET website/_search

{

"min_score":2,

"query":{

"match":{

"title":"单车"

}

}

}

java示例如下:

 

SearchSourceBuilder builder = new SearchSourceBuilder();

builder.minScore(2f);

1.5 高亮查询

{

"query":{

"match":{

"title":"单车"

}

},

"highlight":{

"fields":{

"title":{}

}

}

 

java示例如下:

 

SearchSourceBuilder builder = new SearchSourceBuilder();

MatchQueryBuilder query = QueryBuilders.matchQuery("title", "单车");

HighlightBuilder highlight = new HighlightBuilder();

highlight.field("title");

builder.query(query);

builder.highlighter(highlight);

2. 全文查询

高级别的全文搜索通常用于全文字段上进行全文搜索,通过全文查询理解被查询字段是如何索引和分析的,在执行之前将每个字段的分词器(或搜索分词器)应用于查询字符串。

 

2.1 match query

match查询会解析查询语句。会把查询字符串经过分词器分词后去查询。查询匹配到的文档。

 

{

"query":{

"match":{

"title":"单车"

}

}

}

java示例如下:

 

MatchQueryBuilder query = QueryBuilders.matchQuery("title", "单车");

2.2 match_phrase query

match_phrase query首先会把query内容分词,同时文档还要满足下面两个条件才能被都是到:

 

分此后所有词项都要出现在该字符串中。

字段中的词项顺序要一致。

{

"query":{

"match_phrase":{

"title":"共享单车"

}

}

}

java示例如下:

 

MatchPhraseQueryBuilder query = QueryBuilders.matchPhraseQuery("title", "共享单车");

 

2.3 match_phrase_prefix query

match_phrase_prefix和match_phrase类似,只不过match_phrase_prefix支持最后一个term前缀匹配:

 

{

"query":{

"match_phrase_prefix":{

"title":"共享单"

}

}

}

java示例如下:

 

QueryBuilders.matchPhrasePrefixQuery("title", "共享单");

1

2.4 multi_match query

multi_match是match的升级,用于搜索多个字段。

 

{

"query":{

"multi_match":{

"query":"北京",

"fields":["title","address"]

}

}

}

multi_match支持对要搜索的字段的名称的通配符:示例如下:

 

{

"query":{

"multi_match":{

"query":"北京",

"fields":["title","*_address"]

}

}

也支持指数符指定搜索字段的权重。指定关键词出现在title中的权重是出现在address字段中的3倍,命令如下:

 

{

"query":{

"multi_match":{

"query":"北京",

"fields":["title^3","address"]

}

}

}

 

java示例如下:

 

QueryBuilders.multiMatchQuery("北京","title","address");

1

2.5 common_terms query

common_terms query是一种在不牺牲性能的情况下替代停用词提高搜索准确率和召回率的方案。

 

2.5.1 问题

查询中的每个术语都有成本。搜索"The brown fox"需要三个术语查询,每个查询一个"the","brown"并且 "fox"所有查询都针对索引中的所有文档执行。查询"the"可能与许多文档匹配,因此对相关性的影响比其他两个术语小得多。

 

以前,这个问题的解决方案是忽略高频率的术语。通过将其"the"视为停用词,我们减少了索引大小并减少了需要执行的术语查询的数量。

 

这种方法的问题在于,虽然停用词对相关性的影响很小,但它们仍然很重要。如果我们删除了停用词,我们就会失去精确度,我们无法区分"happy" 和"not happy","The The"或者 "To be or not to be"就不会再索引中存在,搜索的的准确率和召回率就会降低。

 

2.5.2 解决方案

common_terms query 提高了一种解决方案,它把query分词后的词项分成重要词项(低频词项)和不重要词项(高频词,也就是之前的停用词)。在搜索的时候,首先搜索和重要词项匹配的文档,这些文档是词项出现较少并且词项对其评分影响较大的文档。然后执行第二次查询,搜索对评分影响较小的高频词项,但是不计算所有文档的评分,而是只计算第一次查询已经匹配到的文档得分。如果第一个查询中只包含高频词,那么会通过and连接符执行一个单独的查询,换言之,会搜索所有的词项。

 

词项是高频词还是低频词是通过cutoff_frequency来设置阈值的。

 

也许这个查询最有趣的属性是它自动适应域特定的停用词。例如,在视频托管网站上,常见的术语如clip或video将自动表现为停用词而无需维护手动列表。

 

2.5.3 示例

例如,文档频率高于0.1%的词项会被当做高频词,词频直接可以用low_freq_operator、high_freq_operator参数连接。设置低频词操作符为“and”使所有的低频词都是必须搜索到的。

 

{

"query":{

"common":{

"body":{

"query":"nelly the elephant as a cartoon",

"cutoff_frequency":0.001,

"low_freq_opterator":"and"

}

}

}

}

 

上述操作会等价于:

 

{

"query":{

"bool":{

"must":[

{"term":{"body":"helly"}},

{"term":{"body":"elephant"}},

{"term":{"body":"cartoon"}}

],

"should":[

{"term":{"body":"the"}},

{"term":{"body":"as"}},

{"term":{"body":"a"}}

]

}

}

}

java示例如下:

 

QueryBuilders.commonTermsQuery("body","nelly the elephant as a cartoon").cutoffFrequency(0.001f).lowFreqOperator(Operator.AND);

2.6 query_string query

query_string query是与Lucene查询语句的语法结合非常紧密的一种查询,允许在一个查询语句中使用多个特殊条件查询(如:AND|OR|NOT)对多个字段进行查询,建议熟悉Lucene查询语法的用户去使用。

 

java示例如下:

 

QueryBuilders.queryStringQuery("大数据") .field("title").defaultOperator(Operator.AND);

1

3. 词项查询

全文搜索在执行查询之前会分析查询字符串,词项搜索时对倒排索引中存储的词项进行精确操作。词项级别的查询通常用于结构化数据,例如数字、日期和枚举类型。

 

3.1 term query

term query用于精确匹配一个词。

 

{

"query":{

"term":{

"city":"北京市"

}

}

}

java示例如下:

 

QueryBuilders.termQuery("city","北京市");

1

3.2 terms query

terms查询是trem查询的升级,可以用来查询文档中包含多个词的文档。比如想查询city字段中包含关键词“北京市”或“天津市”的文档

 

{

"query":{

"terms":{

"city":["北京市","天津市"]

}

}

}

java示例如下:

 

QueryBuilders.termsQuery("city","北京市","天津市");

1

3.3 range query

range 查询用于匹配在某一个范围内的数值型、日期型或字符串型字段的文档。使用range查询只能查询一个字段,不能作用在多个字段上。range查询支持的参数有以下几种:

 

gt:大于

gte:大于等于

lt:小于

lte:小于等于

例如查询价格 20 < price <= 80的数据:

 

{

"query":{

"range":{

"price":{

"gt":20,

"lte":80

}

}

}

}

查询日期在2020-01-01~2020-01-08的数据:

 

{

"query":{

"range":{

"indexAt":{

"gte":"2020-01-01",

"lte":"2020-01-08",

"format":"yyyy-MM-dd"

}

}

}

}

java示例如下:

 

QueryBuilders.rangeQuery("price").gt(20).lte(80);

1

3.4 exists query

exists查询会返回字段中至少有一个非空值的文档。

 

{

"query":{

"exists":{

"field":"city"

}

}

}

3

java示例如下:

 

QueryBuilders.existsQuery("city");

1

3.5 prefix query

prefix查询用于查询某个字段中给定前缀开始的文档。

 

{

"query":{

"prefix":{

"city":"北京"

}

}

}

java示例如下:

 

QueryBuilders.prefixQuery("city","北京");

1

3.6 wildcard query

wildcard query中文译为通配符查询,支持单字符通配符(?,用来匹配任意一个字符)和多字符通配符(*,用来匹配0个或多个字符)。

 

{

"query":{

"wildcard":{

"city":"北?市"

}

}

}

java示例如下:

 

QueryBuilders.wildcardQuery("city","北?市");

1

3.7 regexp query

ES也支持正则表达式查询,通过regexp query可以查询指定字段包含与指定正则表达式匹配的文档。可以代表任意字符,“a.c.e"和"ab…“都可以匹配"abcde”,a{3}b{3}、a{2,3}b{2,4}、a{2,}{2,}都可以匹配字符串"aaabbb”。

 

例如需要匹配以 W开头紧跟着数字的邮政编码,使用正则表达式查询构造查询语句如下:

 

{

"query":{

"regexp":{

"postcode":"W[0-9].+"

}

}

}

java示例如下:

 

QueryBuilders.regexpQuery("postcode","W[0-9].+");

"wildcard":{

"city":"北?市"

}

}

}

java示例如下:

 

QueryBuilders.wildcardQuery("city","北?市");

文章来自:https://blog.csdn.net/dwjf321/article/details/103904001

 


http://chatgpt.dhexx.cn/article/JyLawjYM.shtml

相关文章

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

uAVS2 AVS2实时编码器

测试平台  PC平台&#xff1a;  i7-4790K, 4.5GHz&#xff1b;超线程开启&#xff1b; 8G内存, 2400MHz。  OS&#xff1a;Win8.1  手机平台&#xff1a;  华为荣耀6。 测试序列  AVS2通测序列 测试指标 编码性能&#xff1a;各种preset下相对RD12.…

谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告

2013年1月&#xff0c;新一代视频编码标准H.265/HEVC正式发布。然而它并没有像H.264那样占据市场。在这期间&#xff0c;AVS2、AV1等竞争者也在逐步推出&#xff0c;究竟谁才能引领新一代视频编码标准呢&#xff1f; 作者 | 李旭峰 王振宇 王荣刚 编辑 | 李旭峰 本…

关于avs和avs2编码stuffing bit的一点理解

avs和avs2编码标准关于结尾有一点和h264的不同。 比如一段视频通过avsx编码后&#xff0c;如果最后1位是字节对齐的&#xff08;也就是说编码后的流刚好是8*n bit&#xff09;&#xff0c;那么就要在最后1bit后面再增加一字节0x80(1000 0000). 如果最后1bit没有对齐&#xff0c…

AVS2运动搜索方法简介

AVS2配置文件中有这一项&#xff1a; FME: 3 #Fast Motion Estimation method (1:DIA, 2:HEX,3:UMH,4:TZ) 表示采用不同的运动搜索方法&#xff0c;下面简单的介绍一下这几种方法。 0.ESA.全像素运动估计搜索算法&#xff08;不使用&#xff09; 这…

一个有趣的avs编码器(注意,是avs,而不是avs2噢)

本章附件是一个清华大学写的关于avs编解码器: https://download.csdn.net/download/weixin_43360707/87793302 该编码器遵循了stuffing bit: 打开文件夹后&#xff0c;如下&#xff1a; 可以看出这个是个跨平台的工程&#xff0c;提供了windows vs2015的工程文件sln&#x…

新一代视频编码标准:HEVC、AVS2和AV1性能对比报告

转自&#xff1a;http://media.pkusz.edu.cn/achievements/?p138 H.265/HEVC 距离H.265/HEVC标准正式发布已经有4年多的时间&#xff0c;虽然其压缩效率比H.264/AVC高出一倍&#xff0c;可以为视频公司节约带宽成本&#xff0c;但H.264仍是目前最流行的视频编码格式。除了复杂…

【AVS系列】AVS2参考软件RD17.0

Date: 2019-4-16 前言 AVS2标准从2017年开始批准使用&#xff0c;至今也有2年了&#xff0c;传说这个标准是对标H265&#xff0c;压缩效率在一些场景下的压缩率优于H.265&#xff0c;但是当前该标准的推广使用仍旧较少&#xff0c;主要用于广电和卫星电视传输。本文主要对AVS2标…

AVS2实时编码器xavs2的运行

Windows10 下 AVS2实时编码器xavs2的下载&#xff0c;编译&#xff0c;运行 xavs2的下载网址&#xff1a; https://gitee.com/pkuvcl/xavs2 可以选择master版本&#xff0c;或者tag版本&#xff0c;具体区别我也不太清楚&#xff0c;我的是1.3版本&#xff0c;我是下载最先的t…

【X265】Win10环境编译FFmpeg,集成 x264、x265、avs2

在Win10中编译完x264、x265后&#xff0c;开始编译FFmpeg&#xff0c;并将集成这几个主流视频编解码算法 准备 系统环境&#xff1a; Win10 VS2019 编译环境&#xff1a; Mingw64 msys2 cmake yasm nasm 编码算法&#xff1a;x264_161、x265_3.3、avs2&#xff08;xavs2…

一个有趣的avs2编码器

该avs2编码器是清华大学开发的一个参考编解码器&#xff1a; https://mp.csdn.net/mp_download/manage/download/UpDetailed 代开文件&#xff0c;结构如下&#xff1a; 考虑到我们是要使用&#xff0c;所以进入到build: 因为我们是linux,cd linux : 继续cd lencod: 编译&a…

AVS2 有点令人不敢相信

王荣刚&#xff1a;建立中国自主视频技术生态 文 / 王荣刚 整理 / LiveVideoStack 直播回放&#xff1a; https://www.baijiayun.com/web/playback/index?classid18072579438145&session_id201807260&tokenPsTmsjVpbRht681rrJ0J_Xl0fbNahfHFmF1doYNdca5XBFzghyiw1…

HEVC 、H.264与AVS2 视频压缩

Lab2 Report: HEVC 、H.264与AVS2 视频压缩 文章目录 Lab2 Report: HEVC 、H.264与AVS2 视频压缩1. 摘要2. 实验一&#xff1a;HEVC 视频编码与解码2.1 实验内容2.2 实验原理简述2.3 实验过程与分析2.3.1 实验环境与测试序列2.3.2 HEVC编码与解码&#xff08;1&#xff09;测试…

AVS2参考软件的运行

博主最近在接触学习AVS2的代码&#xff0c;在查找资料的时候发现关于AVS2的资料少之又少&#xff0c;光是将这个代码运行起来博主也是踏了一些坑&#xff0c;其实遇到的问题都是很简单的&#xff0c;只不过下载下来的代码并没有使用手册&#xff0c;一切都是自己一点点根据代码…

HEVC vs AVS2

AVS2高清实时编码器问世&#xff0c;性能大幅超越HEVC/H.265编码器x265 2015/9/23 北京大学深圳研究生院数字媒体研究中心研制成功首款基于AVS2标准的高清实时编码器uAVS2&#xff0c;性能大幅超越HEVC/H.265编码器x265。2014年12月&#xff0c;面向高清/超高清视频应用的新…

京东云视频云全面支持AVS2标准

一、概述 数字音视频编解码技术标准&#xff08;AVS&#xff09;工作组由国家原信息产业部科学技术司于2002年6月批准成立&#xff0c;目标是制定我国自有的音视频编解码标准。至今已有两代AVS标准正式发布并成为国家标准&#xff0c;目前第三代标准AVS3正在制定中。AVS2属于第…

实现一个avs2码流分析工具

最近在做avs2编码器项目&#xff0c;但是却没有成熟的码流分析工具&#xff0c;于是抽空学习了QT&#xff0c;业余时间写了一个avs2码流分析工具。 软件的界面如下&#xff1a; 图1、avs2码流分析仪界面 UI的左边框为NAL列表或者语法元素列表&#xff1a; 默认情况显示的是NAL列…

AVS2技术

转自http://www.avs.org.cn/avs2/technology.asp AVS2技术 AVS2采用了混合编码框架&#xff0c;整个编码过程包括帧内预测、帧间预测、变换量化、反量化反变换、环路滤波和熵编码等模块。具有如下技术特征&#xff1a; 图1 AVS2编码框架 1.灵活的编码结构划分 为了满足高清和…

AVS2解码图像管理

前言 对于解码器来说&#xff0c;解码得到的重建图像可能需要参与参考帧选择过程和输出排序过程。硬件解码器大概率不会将解码图像的相关操作硬件化&#xff0c;从而将此部分内容保留在软件端实现。 驱动工程师需要明确解码图像的管理逻辑&#xff0c;才能开发出硬件解码器的驱…

AVS2技术概述

转自公众号“智媒之音”&#xff1a;https://mp.weixin.qq.com/s?__bizMzI5Nzc4OTkxOQ&mid2247483715&idx1&snbb28272fd9b2baad9d4cccbe7c8ddcea&chksmecaef1f3dbd978e56764beb9d8ac69c753f3635716e9c449362f34f3c9e738870b1ffa00df4e#rd AVS2采用了传统的混…