• elasticsearch结构化查询过滤语句-----4


    1、之前三节讲述的都是索引结构及内容填充的部分,既然添加了数据那我们的目的无非就是增产改查crudp,我先来讲讲查询-----结构化查询

      我们看上图截图两种方式:

      1)第一种,在索引index5类型school下面定义一个查询query(这就是内嵌查询的关键字),query内部嵌套一个match根据指定field也就是字段查找其内容包含的关键字hawal。

      2)第二种,在索引index5类型school下面定义一个查询query(这就是内嵌查询的关键字),query内部嵌套一个match_all,不指定任何字段任何条件,就相当于查询所有内容,相当于GET /index5/school/_search

     

    2、复杂嵌套查询

      在关系型数据库中有很多条件判断,比如 等于=  不等于!=等等,在es中同样有相应解决方案:

      1)must  需要满足条件  ==或like

      2)must_not  不需要在满足条件内的 !=或 not like

      我们举例查询,在索引index5中查询满足条件name字段包含hawal的,id字段不是12开头或包含12的,写成sql大概是where name like '%hawal%' and id not like '%12%'

      es中是这么表达的,同样定义一个query查询嵌套块,里面定义一个bool(和query一样是es内嵌关键字)的嵌套,name字段must为hawal,id字段must_not为12的。

      

    3、term过滤

      注意哦,这里是精确匹配,大小写什么都很严格,我们查询/index5索引下,name值为hawal或Hawal的查询有两种结果,请看:

      

      看上图,索引中name存的是"Hawal",我们用Hawal"精准"的去匹配匹配不到,用hawal去匹配反而匹配到了,这是为什么呢?因为索引这行数据的时候分析其默认帮我们全转换成了小写,所以大写H开头的Hawal搜索不到,这,不知道是我理解有误还是es这么做有其他原理?

        

    4、terms过滤(多值匹配)

      

    5、range过滤

      上图查询索引index5下subject下id大于或等于1002的所有内容

      范围操作符包含:

            

    6、exists和missing过滤

      exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件

      我们举个例子,查找索引index5下name字段不为空的内容

      

      其实就是指定field(字段)去查name字段不为空的内容,missing就不举例了。

     

    7、bool过滤

      见本篇第二小节,must,must_not,should

     

    8、match_all语句

      GET /index5/_search
      {
        "query": {
          "match_all": {}
          }
      }

      其实就相当于GET /index5/_search

    9、带过滤的查询语句

      如我现在精确匹配索引index5下name包含mit的内容

      GET /index5/_search
      {
        "query":{
        "term":{
          "subject.subject-name":"computer"
           }
        }
      }

      但是我同时向加入另一条过滤,在匹配subject.subject-name包含"computer"的同时还需要过滤subject.students大于1002的内容

      

      

      我们看上图执行结果,索引/index5中subject.subject-name字段匹配computer的内容,然后过滤掉里面subject.students大于1002的内容,这里所有结果的students都小于1002,所以均返回了。

      那我们可以很好的理解query和filter的区别,query是现实匹配的,filter是在已匹配的内容里面过滤掉满足fiter条件的内容。

      请注意------es 5.x往后的版本去掉了filters语法,统一采用bool嵌套filter的语法。

    10、验证查询

      有时候我们写了一个查询语句,但是可能由于语法错误或指定查询的字段不存在报了一堆错误,但是提示信息并不明显,这时es给我们提供了一个校验请求语法的功能,其实就是在执行前先会帮忙校验一下语法是否正确,并会给出相关提示信息:

      比如我要查询索引index5下所有name字段中包含“tinghua”的内容,但这是我把内嵌查询query字段拼成了qery,这时就该提示Unknown key for a START_OBJECT in [qery]。

      

      其实,我们可以先对查询体做校验,在请求体后加上/_validate/query即可:

      

     

      可以看到右边的校验结果为false,想看到更具体的结果,加上?explain即可

      

     

      如果校验成功,我们会看到es的索引结果,如你用的分析器将你需要搜索的内容拆分成几个字段,在哪些索引中查找到内容都能看到:

      

     

  • 相关阅读:
    小小c#算法题
    .net中值类型、引用类型理解的c#代码示例
    小小c#算法题
    小小c#算法题
    小小c#算法题
    小小c#算法题
    python 正则表达式(一)
    python string 文本常量和模版
    centos6安装redis
    sqoop命令总结
  • 原文地址:https://www.cnblogs.com/dbaxyx/p/6341038.html
Copyright © 2020-2023  润新知