【ES】ElasticSearch 结构化查询和过滤

一、DSL

在 ElasticSearch 中,提供了功能十分丰富、多种表现形式的查询语言—— DSL 查询。

Query DSL 又叫结构化查询,使用 JSON 格式的请求体 与 ElasticSearch 交互,使查询语句更灵活、更精确、更易读且易调试。

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

GET /_search
{
    "query": YOUR_QUERY_HERE
}

主要包含两种类型的查询语句:叶子查询语句复合查询语句

1.1、叶子查询语句

这种查询可以单独使用,针对指定的字段查询指定的值,例如:match, term, range 等。

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

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

或指向一个指定的字段:

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

例如,可以使用 match 查询子句用来找寻在 tweet 字段中找寻包含 elasticsearch 的成员:

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

1.2、复合查询语句

这种查询可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑。

例如,bool 子句允许合并其他的合法子句,mustmust_not 或者 should

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

二、Query DSL 和 Filter DSL

Elasticsearch 使用的查询语言(DSL) 拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:查询情况 query context过滤情况 filtering context ,也即结构化查询 Query DSL结构化过滤 Filter DSL

查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异。

2.1、Query DSL

在上下文查询语境中,查询语句会询问文档与查询语句的匹配程度,它会判断文档是否匹配并计算相关性评分(_score)的值。

例如:

  • 查找与 full text search 这个词语最佳匹配的文档
  • 查找包含单词 run,但是也包含runs, running, jogsprint的文档
  • 同时包含着 quick, brownfox— 单词间离得越近,该文档的相关性越高
  • 标识着 lucene, searchjava— 标识词越多,该文档的相关性越高

一条查询语句会计算每个文档与查询语句的相关性,然后给出一个相关性评分 _score,并且按照相关性对匹配到的文档进行排序。

2.2、Filter DSL

在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度(相关性评分)。

例如:

  • created 的日期范围是否在 20132014 ?
  • status 字段中是否包含单词 “published” ?
  • lat_lon 字段中的地理位置与目标点相距是否不超过10km ?

2.3、比较

相关度:

  • filter —— 只根据搜索条件过滤出符合的文档,将这些文档的评分固定为1,忽略 TF/IDF 信息,不计算相关度分数;
  • query —— 先查询符合搜索条件的文档, 然后计算每个文档对于搜索条件的相关度分数,再根据评分倒序排序。

性能:

  • filter 性能更好,无排序 —— 不计算相关度分数&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值