TairSearch:bool联合条件查询

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: TairSearch是Tair自主研发的高性能、低延时、基于内存的实时全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法。一些用户在使用过程中会咨询到复杂联合查询语句的用法,本篇文章主要介绍如何在tairsearch中使用bool联合条件查询实现一些复杂场景的查询。## bool语句详解bool是TairSearch中支持复杂联合查询的常用语法,主要支持有3种特

TairSearch是Tair自主研发的高性能、低延时、基于内存的实时全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法。一些用户在使用过程中会咨询到复杂联合查询语句的用法,本篇文章主要介绍如何在tairsearch中使用bool联合条件查询实现一些复杂场景的查询。

bool语句详解

bool是TairSearch中支持复杂联合查询的常用语法,主要支持有3种特性:

  • must:类似AND 的语义,在must 数组中的语句均为必要条件,结果集合中的文档均需命中must 数组里的查询条件。
  • should: 类似OR 的语义,在should 数组中的语句均为可选条件。命中should 数组的条件语句可增加该文档的score值,影响文档的排名。 有以下几种匹配该数组的情况:

    1. must数组为空时,结果集合中的文档需命中至少一个should数组中的条件呢。
    2. must语句不为空时,不需要命中should数组中的条件。
    3. 配置了minimum_should_match, 那么结果集合中的文档则必须命中should数组中minimum_should_match个数的条件。
  • must_not:类似NOT 的语义,要求结果集合中的文档均不可命中must_not 数组中的查询条件。

bool 语句这三种特性的优先级排序为must_not >must >should
这三种特性的数组中均为查询语句,支持任意类型的查询语句,包括bool类型,即bool类型的查询语句中的数组子句可以再嵌套bool类型,由此实现复杂场景的查询。

bool联合查询实践

假设schema中有几个字段:A、B、C,每个字段的类型为keyword。keyword的语义是搜索该类型的字段时要求与查询条件参数全字符串匹配。
创建key:

redis-cli tft.createindex key '{
    "mappings": {
        "properties": {
            "A": { "type": "keyword" },
            "B": { "type": "keyword" },
            "C": { "type": "keyword" }
        }
    }
}'

写入文档:

redis-cli tft.adddoc key '{
    "A": "a",
    "B": "b",
    "C": "c"
}'

查询1:select A=a and B=b

redis-cli tft.search key '{
    "query": {
        "bool" : {
             "must": [
                 { "term": { "A": "a" }  },
                 { "term": { "B": "b" } }
             ]
         }
    }
}'

查询2:select A=a or B = b

redis-cli tft.search key '{
    "query": {
        "bool" : {
             "should": [
                 { "term": { "A": "a" }  },
                 { "term": { "B": "b" } }
             ]
         }
    }
}'

查询3:select A=a and B != b

redis-cli tft.search key '{
    "query": {
        "bool": {
            "must": [
                 { "term": { "A": "a" }  }
            ],
            "must_not": [
                 { "term": { "B": "b" } }
            ]
        }
    }
}'

查询4:select (A=a and B = b) or C = c

redis-cli tft.search key '{
    "query": {
        "bool" : {
            "should": [
                {
                    "bool": {
                        "must": [
                             { "term": { "A": "a" } },
                             { "term": { "B": "b" } }
                         ]
                    }
                },
                { "term": { "C": "c" }  }
            ]
        }
    }
}'
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
SQL 缓存 Oracle
为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)
本文介绍了COUNT函数的用法,主要用于统计表行数。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。
12076 0
为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)
queryDsl多表联合查询,任意查询联合字段
这是我的通用方法 package com.spark.bitrade.service.Base; import com.querydsl.core.Tuple; import com.
4258 0
|
关系型数据库 MySQL 数据库管理
insert 与 select 的联合使用
insert 与 select 的联合使用
404 0
|
缓存 索引
Elastic: 常量分数查询constand_score query应用场景
最近正好有同学问到constand score查询与其他查询的区别,趁此机会,我们来详细了解下constant score查询
225 0
Elastic: 常量分数查询constand_score query应用场景
|
开发者
布尔值(bool)查询|学习笔记
快速学习布尔值(bool)查询。
103 0
布尔值(bool)查询|学习笔记
|
JSON 数据格式 开发者
布尔值(bool)查询 | 学习笔记
快速学习布尔值(bool)查询
布尔值(bool)查询 | 学习笔记
|
小程序 编译器 C++
C++菜鸟学习笔记系列(19)——返回类型和return语句
C++菜鸟学习笔记系列(19)——返回类型和return语句
247 0
|
SQL
【TP5.1】whereOr的用法(双条件查询)
【TP5.1】whereOr的用法(双条件查询)
632 0
【TP5.1】whereOr的用法(双条件查询)
|
关系型数据库 MySQL Java
mysql字段的细节(查询自定义的字段[意义:行列转置];UNION ALL;case-when)
mysql字段的细节(查询自定义的字段[意义:行列转置];UNION ALL;case-when)
210 0
mysql字段的细节(查询自定义的字段[意义:行列转置];UNION ALL;case-when)
|
存储 关系型数据库 MySQL
type列详解及案例分析
Explain 命令中的 type 列,显示MySQL查询所使用的 关联类型(Join Types) 或者 访问类型,它表明 MySQL决定如何查找表中符合条件的行。 常见访问类型性能由最差到最优依次为:ALL < index < range < index_subquery < unique_subquery < index_merge < ref_or_null < fulltext < ref < eq_ref < const < system。