ES六| elasticsearch的结构化查询DSL

本文介绍Elasticsearch中请求体查询的应用,包括结构化查询QueryDSL的使用方法、查询子句与过滤语句的区别,以及如何构建复合查询提高搜索效率。

免责声明:本专栏的内容都是在读了《Elasticsearch权威指南( 中文版)》书籍后整理的读后感及部分内容笔记,具体内容请查阅原著内容。

引言

请求体查询(下文简称查询), 并不仅仅用来处理查询, 而且还可以高亮返回结果中的片段, 并且给出帮助你的用户找寻最好结果的相关数据建议。相对于神秘的查询字符串方法, 请求体查询允许我们使用结构化查询Query DSL(Query Domain Specific Language)。

结构化查询 Query DSL

结构化查询是一种灵活的, 多表现形式的查询语言。 Elasticsearch在一个简单的JSON接口中用结构化查询来展现Lucene绝大多数能力。 你应当在你的产品中采用这种方式进行查询。 它使得你的查询更加灵活, 精准, 易于阅读并且易于debug。

使用结构化查询, 你需要传递 query 参数:

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

空查询  {}  在功能上等同于使用 match_all 查询子句, 正如其名字一样, 匹配所有的文档。

一个查询子句一般使用这种结构:

{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}

或指向一个指定的字段,例如, 你可以使用 match 查询子句用来找寻在 tweet 字段中找寻包含 elasticsearch 的成员:

GET /_search
{
    "query": {
        "match": {
            "tweet": "elasticsearch"
        }
    }
}

合并多子句

查询子句就像是搭积木一样, 可以合并简单的子句为一个复杂的查询语句, 比如:

  • 叶子子句(leaf clauses)(比如 match 子句)用以在将查询字符串与一个字段(或多字段)进行比较;
  • 复合子句(compound)用以合并其他的子句。 例如, bool 子句允许你合并其他的合法子句, must , must_not 或者 should , 如果可能的话;

例如:

GET /_search
{
    "bool": {
        "must": { "match": { "tweet": "elasticsearch" }},
        "must_not": { "match": { "name": "mary" }},
        "should": { "match": { "tweet": "full text" }}
    }
}

复合子句能合并 任意其他查询子句, 包括其他的复合子句。 这就意味着复合子句可以相互嵌套, 从而实现非常复杂的逻辑。

查询与过滤

我们可以使用两种结构化语句: 结构化查询( Query DSL) 和结构化过滤( Filter DSL) 。 查询与过滤语句非常相似, 但是它们由于使用目的不同而稍有差异。

一条过滤语句会询问每个文档的字段值是否包含着特定值:

  • created 的日期范围是否在 2013 到 2014 ?

  • status 字段中是否包含单词 "published" ?

  • lat_lon 字段中的地理位置与目标点相距是否不超过10km ?

一条查询语句与过滤语句相似, 但问法不同:查询语句会询问每个文档的字段值与特定值的匹配程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值