6.查询语句
查询语句的分类?
1、请求体查询(最常用)
将相关查询条件放在请求体中。
请求体查询又称为 Query DSL (Domain Specific Language) 领域特定语言,包括:
叶子查询:指定条件指定字段查询,包括term 分词查询和全文检索(match,match_phrase)
复合查询:可包含叶子查询语句和复合查询,主要包括bool 和 dis_max
2、请求 URI
将相关查询条件放在 URI 中,这种方式不常用,了解即可
GET /users/\_search?q=\*&sort=age:asc&pretty
3、类 SQL 检索
POST /_sql?format=txt 2 { { "query": "SELECT * FROM uint-2020-08-17 ORDER BY itemid DESC LIMIT 5" }
功能还不完备,不推荐使用。
Term 查询和全文检索区别?
term 查询条件不做分词处理,只有查询词和文档中的词精确匹配才会被搜索到,一般用于非文本字段查询。
全文检索一般用于文本查询,会使用对应分词器,步骤为:分词->词项逐个查询->汇总多个词项得分。
如何实现范围查询?
range 查询用于匹配在某一范围内的数值型、日期类型或者字符串型字段的文档,比如出生日期在1996-01-01 到 2000-01-01 的人。使用 range 查询只能查询一个字段,不能作用在多个字段上。
range 查询支持的参数有以下几种:
gt 大于,查询范围的最小值,也就是下界,但是不包含临界值。
gte 大于等于,和gt 的区别在于包含临界值。
lt 小于,查询范围的最大值,也就是上界,但是不包含临界值。
lte 小于等于,和lt 的区别在于包含临界值。
# 查询出生日期在 1996-01-01 到 2000-01-01 的人 GET users/_search 3 { { "query": { "range": { "birthday": { "gte": "1996-01-01", "lte": "2000-01-01", "format": "yyyy-MM-dd" } } } }
Match 和 Match_phrase 区别?
match 查询多个检索词之间默认是 or 关系,可使用operator 改为 and 关系,分词查询
查询多个检索词之间默认是 and 关系,并且词的位置关系影响搜索结果,全文检索
Multi match 有几种匹配策略,都有什么区别?
Multi match 用于单条件多字段查询,有以下几种常用的匹配策略:
best_fields (默认) :查询结果包含任一查询条件,但最终得分为最佳匹配字段得分
most_fields :查询结果包含任一查询条件,但最终得分合并所有匹配字段得分,默认查询条件之间是 or 连接
cross_fields:跨字段匹配, 解决了most_fields 查询词无法使用and 连接的问题,匹配更加精确, and 相当于整合多个字段为一个字段,但又不像copy_to占用存储空间。
bool 查询有几种查询子句?
bool 一般用于多条件多字段查询,可包含match ,match_phrase ,term 等简单查询语句,主要有以下 4 种查询子句
must : 结果必须匹配 must 查询条件,贡献算分
should : 结果应该匹配 should 子句查询的一个或多个,贡献算分
must_not : 结果必须不能匹配该查询条件
filter : 结果必须匹配该过滤条件,但不计算得分,可提高查询效率
比如,你想在北京找一个有房或者有车 ,身高不低于 150 的女朋友,下面这条语句安排上。
GET /users/_search { "query": { "bool": { "must": [ { "match": { "gender": "female" //性别必须为女 } } ], "should": [ { "match": { "hasroom": "true" //有房或者有车 } }, { "match": { "hascar": "true" } } ], "must_not": [ { "range": { "height": { "gte": 150 //身高不低于150 } } } ], "filter": [ { "term": { "address": "北京" //必须北京,不过不算分 } } ] }