一、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搜索初探的更多相关文章

  1. ELASTICSEARCH 搜索的评分机制

    从我们在elasticsearch复合框输入搜索语句到结果显示,展现给我们的是一个按score得分从高到底排好序的结果集.下面就来学习下elasticsearch怎样计算得分. Lucene(或 El ...

  2. day 84 Vue学习六之axios、vuex、脚手架中组件传值

    Vue学习六之axios.vuex.脚手架中组件传值   本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...

  3. 看完这篇还不会 Elasticsearch 搜索,那我就哭了!

    本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性. Search ...

  4. [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  5. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  6. TweenMax动画库学习(六)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

  8. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  9. SVG 学习<六> SVG的transform

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

随机推荐

  1. 在WPF中,如何得到任何Object对象的XAML代码?

    原文:在WPF中,如何得到任何Object对象的XAML代码? 在WPF中,可以使用System.Windows.Markup.XamlWriter.Save(objName)得到任何Object对象 ...

  2. github网页

    GitHub主页 创建仓库 想必大家都有自己的Github账号吧,没有的可以到GitHub官网注册账号,注册完后,我们来下一步,在我们的GitHub上面右上角的New repository来创建一个仓 ...

  3. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  4. 【Git】整合分支那些事儿

    对于scm这个岗位来说,基线升级应该是这个岗位需要的必备技能了,现在来说说我司进行高通代码基线升级时选择的方式方法,供大家参考,也供自己学习积累. git这个工具大家都并不陌生,但是对于不经常提交代码 ...

  5. Win8 Metro(C#)数字图像处理--2.50图像运动模糊

    原文:Win8 Metro(C#)数字图像处理--2.50图像运动模糊  [函数名称] 图像运动模糊算法    MotionblurProcess(WriteableBitmap src,int  ...

  6. 芒果TV For Windows10 成长历史 & 迭代历史 & 新闻报道

    芒果TV 是国内领先的基于Windows10操作系统并支持Windows10全系列设备的视频应用和内容服务商. Win10商店版<芒果TV>是湖南快乐阳光互动娱乐传媒有限公司专门为Wind ...

  7. DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  8. 微信小程序把玩(二十四)toast组件

    原文:微信小程序把玩(二十四)toast组件 toast消息提示框,可用在提示一些信息,比如清楚缓存给用户一个友好的提示!或操作一些请求不想让用户有什么操作,toast也可以做到因为toast显示时其 ...

  9. 毕设(一)C#的百度api调用

    这个学期就要毕业了,选了一个无人机地面站软件设计的题目,这几天也开始着手做, 首先做了一个百度地图的调用,这里因为是上位机的开发,所有就不介绍Javascript的 调用方法,核心是用到一个类Http ...

  10. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...