ES搜索和DSL

前面主要介绍了Elasticsearch的索引和映射,但这两个内容只解决存储的问题,在使用Elasticsearch的时候,大部分是和搜索相关的内容。

现在开始介绍Elasticsearch的搜索功能,通过学习详细了解搜索的语法和查询专用语言(DSL)的相关知识。

深入搜索

搜索方式

1.URL参数搜索

请求:GET http://127.0.0.1:9200/secislan/_search?参数,多个参数用&分开。

2.POST请求参数搜索

请求:POST http://127.0.0.1:9200/secislan/_search。参数在请求头中。

参数是JSON格式的查询领域语法(query dsl),如果需要搜索分页,可以通过from size组合来进行。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10

注意 size的大小不能超过index.max_result_window这个参数的设置,默认为10000。

3.排序sort

当搜索的字段有多个时,可以对指定字段进行排序。例如下面的搜索优先对price字段进行排序,然后对count字段进行排序:

当一个字段的内容有多个值的时候,系统支持一些计算进行排序,包括min、max、sum、avg、median(中间值)。

4.数据列过滤数据列过滤

允许在查询的时候不显示原始数据,或者显示部分原始字段。例如:只查询商品的名称和价格:

GET /ecommerce/product/_search
{
     "query":{
          "match_all":{}
     },
     "_source":["name","price"]
}

查询名称包含yagao,并且售价大于25的商品: bool可以封装多个查询条件

GET /ecommerce/_search
{
     "query":{
          "bool":{
               "must":{
                    "match":{
                         "name":"yagao"
                    }
               },
               "filter":{
                    "range":{
                         "price":{
                              "gt" : 25
                           }
                       }
                    }
               }
          }
    }

具体的查询就不看了,使用的时候再细看。

ElasticSearch DSL

Elasticsearch提供了基于JSON的完整查询DSL(特定于域的语言)来定义查询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:

查询和过滤

  • □叶查询子句:在特定的字段上查找特定的值,比如match、term或者range查询。这些查询可以自己使用。
  • □复合查询子句:包含其他叶查询或复合查询子句,以合理的方式结合多条查询(比如bool或dis_max查询),或者改变查询行为(比如not或constant_score查询)。
  • □查询(query)用于检查内容与条件是否匹配,并且计算_score元字段表示匹配度。查询的结构中以query参数开始来执行内容查询。
  • □过滤(filter)不计算匹配得分,只是简单地决定文档是否匹配。内容过滤主要用于过滤结构化的数据,例如:时间段是否在2015到2016年之间,status字段是否设置为“published”。

我们在使用ElasticSearch的时候,避免不了使用DSL语句去查询,就像使用关系型数据库的时候要学会SQL语法一样。如果我们学习好了DSL语法的使用,那么在日后使用和使用Java Client调用时候也会变得非常简单。

举个查询子句的例子。查询会匹配符合下列所有条件的文档:

  • □title字段包含单词Search。
  • □content字段包含单词Elasticsearch。
  • □status字段包含准确的单词published。
  • □publish_date字段包含从2015年1月1日之后的日期。

请求:POST http://127.0.0.1:9200/secisland/_search

query参数表示内容查询。内容查询中使用的bool和match子句,用于计算每个文档的匹配得分。

filter参数表示内容过滤。内容过滤中使用的term和range子句,会过滤掉不匹配的文档,并且不影响计算文档匹配得分。

最简单的查询,匹配所有文档,文档的_score值是1.0。

可以使用boost参数修改_score值:

 

高亮显示

Elasticsearch中的高亮显示是来源于Lucene的功能,允许在一个或者多个字段上突出显示搜索内容,

Lucene支持三种高亮显示方式

highlighter、fast-vector-highlighter、postings-highlighter

第一种是默认的标准类型。下面先看一个实例,在搜索前,先增加一条文档。

请求:PUT http://127.0.0.1:9200/secilog/log/10?pretty

参数:

文档创建好后,我们进行高亮搜索:

请求:POST http://127.0.0.1:9200/secilog/log/_search?pretty

参数:

有高亮显示的内容,<em>analyse</em>。为了执行高亮显示,该字段必须有实际的内容。并且这个字段必须进行存储,就是在字段映射中store的值必须为true,不能只在内存中。系统会自动加载_source字段并匹配相关的列。字段名称支持通配符符号,例如可以用"message*":{}参数匹配所有message开头的字段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值