TairSearch:bool联合条件查询

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 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
目录
相关文章
queryDsl多表联合查询,任意查询联合字段
这是我的通用方法 package com.spark.bitrade.service.Base; import com.querydsl.core.Tuple; import com.
4202 0
|
关系型数据库 PostgreSQL
PostgreSQL listagg within group (order by) 聚合兼容用法 string_agg ( order by) - 行列变换,CSV构造...
标签 PostgreSQL , order-set agg , listagg , string_agg , order 背景 listagg — Rows to Delimited Strings The listagg function transforms values from a g...
6123 0
|
10月前
|
关系型数据库 MySQL 数据库管理
insert 与 select 的联合使用
insert 与 select 的联合使用
377 0
|
开发者
布尔值(bool)查询|学习笔记
快速学习布尔值(bool)查询。
布尔值(bool)查询|学习笔记
|
JSON 数据格式 开发者
布尔值(bool)查询 | 学习笔记
快速学习布尔值(bool)查询
168 0
布尔值(bool)查询 | 学习笔记
|
前端开发 数据库
FineReport中使用一个搜索框查询数据库中多列值返回一列值:使用union函数
前端使用一个查询框(搜索框)查询数据库中多列值,这里使用数据库的union函数进行实现
217 0
|
关系型数据库 MySQL Java
mysql字段的细节(查询自定义的字段[意义:行列转置];UNION ALL;case-when)
mysql字段的细节(查询自定义的字段[意义:行列转置];UNION ALL;case-when)
200 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。
|
XML 设计模式 前端开发
“禁止用 select * 作为查询字段列表”落地指南
《阿里巴巴 Java 开发手册》 MySQL 数据库部分,ORM 映射部分,谈到: 【强制】 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。 说明: 1)增加查询分析器解析成本。 2)增减字段容易与 resultMap 配置不一致。 3)无用字段增加网络消耗,尤其是 text 类型的字段。 甚至有些公司还会对代码进行扫描,当发现代码或者 MyBatis 配置中出现 `select *` 时会给出告警要求修改。
309 0
“禁止用 select * 作为查询字段列表”落地指南
|
Go 索引
TableStore多元索引复合类型的使用诀窍:array还是nested
对主表中需要查询的列(Column)建立多元索引,即可通过该列的值查询数据。索引列分为基本类型和复合类型,本文详细介绍两种复合类型——数组类型(array)和嵌套类型(nested)的使用。
3077 0