zoukankan      html  css  js  c++  java
  • 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核心技术与实战》  

  • 相关阅读:
    SAP CRM One Order函数CRM_Object_FILL_OW的设计原理
    SAP CRM One Order函数CHANGE_OW的设计原理
    SAP CRM One Order函数SAVE_EC的设计原理
    POJ-1125 Stockbroker Grapevine
    GStreamer 1.0 series序列示例
    H265与ffmpeg改进开发
    FFmpeg扩展开发
    在Yolov5 Yolov4 Yolov3 TensorRT 实现Implementation
    TensorRT 基于Yolov3的开发
    大规模数据处理Apache Spark开发
  • 原文地址:https://www.cnblogs.com/supersnowyao/p/11187059.html
Copyright © 2011-2022 走看看