ElasticStack学习(六):ElasticSearch搜索初探
一、ElasticSearch搜索介绍
1、ElasticSearch搜索方式主要分为以下两种:
1)、URI Search:此种查询主要是使用Http的Get方法,在URL中使用查询参数进行查询;
如:http://localhost:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Jim
这条URL中,q表示查询的内容,用来搜索名叫Jim的客户。用Postman进行查询,搜索结果如下图所示:
2)、Request Body Search(DSL查询):此种查询是使用ElasticSearch提供的,可以采用Get或Post的方法,基于JSON格式的更加完备的DSL(Query Domain Specific Language);
如:http://localhost:9200/kibana_sample_data_ecommerce/_search
在请求体中写入:
{ "query":{"match_all":{}} }
其中match_all代表返回所有的文档。
或同样查询customer_first_name:Jim,如下:
{ "profile": true, "query": { "match": {"customer_first_name":"Jim"} } }
用Postman进行查询,结果如下图所示:
took表示查询用时;hits表示查到了多少结果,ElasticSearch默认列出10条;_score表示相关度评分;_source表示文档原始信息;
所以,大体上可根据以下语法进行查询:
/_search 查询范围:集群上所有的索引; /index-name1/_search 查询范围:只查询index-name1索引; /index-name1,index-name2/_search 查询范围:查询index-name1,index-name2两个索引; /index*/_search 查询范围:查询以index开头的索引;
2、搜索相关性
搜索是用户与搜索引擎的对话,比较关注的有如下几点:
1)是否可以找到所有相关的内容;
2)有多少不相关的内容被返回了;
3)文档的打分是否合理;
4)结合业务需求,平衡结果排名;
3、搜索结果的衡量
1)Precision-查准率:尽可能返回较少的无关文档,公式为:返回的相关结果/(返回的相关结果+返回的无关结果)
2)Recall-查全率:尽量返回较多的相关文档,公式为:返回的相关结果/(返回的相关结果+应该返回但没有返回结果)
3)Ranking-排名:是否能够按照相关度进行排序;
二、ElasticSearch URI搜索操作
通过URI Query实现搜索,语法如下:
Get /movies/_search?q=2012&df=title_name&sort=year:desc&from=0&size=10&timeout=1s{ "profile":true}
q:指定的查询语句,使用Query String 语法;
df:默认字段,若不指定,会对所有字段进行查询;
sort:用于排序;
from、size:用于分页;
profile:用于展示查询是如何被执行的;
1、指定字段查询、泛查询
指定字段查询:就是查询的值是在某个字段范围内进行的查询。对movies索引中的title字段做2012信息的查询,查询结果如下图所示:
泛查询:就是查询的值是对索引中所有字段进行匹配,如下图所示:
2、Term【词语】查询与Phrase【短语】查询
两者区别在于,若要查询一条信息,如Iron Man
对于Term查询,Iron Man等效于Iron OR Man;
对于Phrase查询,“Iron Man"等效于Iron AND Man,而且要求前后顺序要保持一致;
注意:对于Term查询,需要加上括号才可以;对于Phrase查询,需要加上引号才可以;
如下图所示:
3、布尔查询
布尔表示符:AND/OR/NOT(+、-),注意:符号必须大写。具体操作如下图所示:
在AND查询中,我们会发现查询出8条结果,与Phrase查询结果并不相同。原因在于:Phrase查询要求查询信息前后顺序必须是一致的,而AND查询并没有这个要求,因此多出两条查询数据。
在OR查询中,我们会发现与Term查询结果是相同的,包括profile中所列出的description都是一样的。不相同的是查询类型,Term查询是TermQuery,Or查询是BooleanQuery。
4、范围查询
[]:表示闭区间;{}:表示开区间;如下图所示:
上图中,开区间查询,在profile中会发现,查询范围是从2016至2019,开区间意味着要大于开区间的起始值。
5、算数符号查询
包括:>、>=、<、<=,如下图所示:
6、通配符查询
通配符查询效率低、占用内存大,故不建议使用。
?:代表1个字符;*:代表0或多个字符;
7、模糊/近似度匹配查询
从上面两图中可以看出,近似度查询中的~1表示一个词中允许有一个字母与正确单词不差别;~2表示对一个短语进行搜索,可以搜索到缺失1个或2个词的短语,2个以上的不属于此搜索范围。
8、正则表达式查询
三、Request Body搜索操作(DSL操作)
在ElasticSearch中,一般高阶的搜索操作都是通过Request Body来实现。
//通过from size返回查询结果,注意:获取靠后的翻页成本较高。 post /movies/_search { "profile": true, “from":10, "size":20, "query": { "match": {"title":"iron man"} } } //通过sort对查询结果进行排序,注意:排序字段最好是“数字型”或“日期型” post /movies/_search { "profile": true, "sort":[{"order_date":"desc"}] "from":10, "size":20, "query": { "match": {"title":"iron man"} } }
//通过_source元数据过滤,返回相应的字段,此时,对"iron man"的查询是iron OR man的逻辑 post /movies/_search { "profile":true, "_source":["title","year"], "from":10, "size":5, "sort":[{"year":"desc"}], "query":{ "match": {"title":"iron man"} } } //若想对"iron man"执行iron AND man的逻辑,可按如下操作 post /movies/_search { "profile":true, "_source":["title","year"], "from":10, "size":5, "sort":[{"year":"desc"}], "query":{ "match"{ "title":{ "query":"iron man", "operator":"AND" } } } }
两者执行结果,如下图所示:
//脚本字段,通过script_fields对返回字段进行加工,来算出一个新的字段 post /movies/_search { "profile":true, "script_fields":{ "new_fields":{ "script":{ "lang":"painless", "source":"doc['year'].value+'-hello'" } } }, "_source":["title","year"], "from":0, "size":10, "sort":[{"year":"desc"}], "query":{ "match_all":{} } }
//短语搜索,注意slop的意思是可以在iron man之间可以有1个其他的字符 post /movies/_search { "profile":true, "_source":["title","year"], "query":{ "match_phrase":{ "title":{ "query":"iron man", "slop":"1" } } } }
四、Query String和Simple Query String搜索(也是DSL操作)
我们向索引users中插入两条文档:
put /users/_doc/3 { "name":"tang bohu", "about":"gongfu,wencai,huahua" } put /users/_doc/4 { "name":"zhang sanfeng", "about":"gongfu,youmo" }
1、Query String
在DSL中也是可以支持类似于URI Query的查询。
2、Simple Query String
该种查询的特点:
1)此种查询类似于Query String,但是会忽略错误的语法,同时只支持部分查询语法;
2)不支持AND、OR、NOT,只会将其作为字符串处理;
3)Term之间的默认关系是OR,通过Operator可以指定其他关系;
4)支持部分逻辑:+、-、|;
注意:Query、Query String、Simple Query String在使用时,后两者的灵活性降低了,但是更容易写;而第一种灵活性最大,但是容易出错。
大家可关注我的公众号
知识学习来源:《Elasticsearch核心技术与实战》
ElasticStack学习(六):ElasticSearch搜索初探的更多相关文章
- ELASTICSEARCH 搜索的评分机制
从我们在elasticsearch复合框输入搜索语句到结果显示,展现给我们的是一个按score得分从高到底排好序的结果集.下面就来学习下elasticsearch怎样计算得分. Lucene(或 El ...
- day 84 Vue学习六之axios、vuex、脚手架中组件传值
Vue学习六之axios.vuex.脚手架中组件传值 本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...
- 看完这篇还不会 Elasticsearch 搜索,那我就哭了!
本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性. Search ...
- [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- Hbase深入学习(六) Java操作HBase
Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...
- TweenMax动画库学习(六)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- 一次 ElasticSearch 搜索优化
一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...
- ElasticSearch搜索介绍四
ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...
- SVG 学习<六> SVG的transform
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
随机推荐
- jquery 标签页
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- delphi获取dll的函数列表
找了几个,终于找到一个好用的 function GetDLLFileExports( szFileName: PChar; mStrings: TStrings): Boolean;var hFi ...
- 企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(1)
前言对于WPF和Silverlight来讲,MVVM是微软设计师和业内专家高度推荐的非常棒的一种设计模式.本书会探讨MVVM设计模式的一些自身缺陷以及为什么MVVM还不能成为行业内的标准设计模式.这会 ...
- hMailServer搭建简单邮件系统
本文介绍的是搭建本地的邮件系统,至于互联网的还在研究之中. 1.需要一个邮件服务器软件,这里用的是hMailServer,其中会让你设置一个密码,记住这个密码,后面连接的时候回用到. 2.添加域名 因 ...
- CNN(卷积神经网络)、RNN(循环神经网络)和DNN(深度神经网络)
本文转载修改自:知乎-科言君 感知机(perceptron) 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perceptron),拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换达 ...
- CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)
所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...
- SYN591-C型 时间间隔表
SYN591-C型 时间间隔表 脉冲计数器数显计数器电机转速表使用说明视频链接: http://www.syn029.com/h-pd-250-0_310_44_-1.html 请将此链接复制到 ...
- Java开发桌面程序学习(九)——JavaFxTemplate JavaFx模版 更简单进行JavaFx程序开发
JavaFxTemplate 使用说明 项目基于maven,请确保maven配置成功,否则,可能会出现问题 项目内置了commons-io的jar包,Jfoenix的jar包以及常用的工具类JFxUt ...
- 【转】Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录
转自:http://blog.csdn.net/cloudday/article/details/8640234 1. 启动VSFTP服务器 A:cenos下运行:yum install vs ...
- jvm(4)---垃圾回收(哪些对象可以被回收)
1.java堆中几乎放着所有对象的实例,那么什么样子的对象才是可以被回收的呢? 1.1.引用计数法: 给对象添加一个引用计数器,当有地方引用的时候,计数器就+1,引用失效就-1:任何时候当计数器为0, ...