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": "北京" //必须北京,不过不算分
                }
            }
          ]
 }                                

 

posted @ 2024-03-21 15:56  壹索007  阅读(8)  评论(0编辑  收藏  举报