美文网首页
ES6 - 4 高级查询

ES6 - 4 高级查询

作者: 阿尔卡雷特 | 来源:发表于2018-11-28 18:29 被阅读0次

1. 子条件查询 (特点字段查询所指定值)

1.1 Query context(模糊)

  查询时除判断是否满足查询条件外,还会计算一个“_score"的匹配标示值来判断目标文档和查询条件的匹配度。
  分:全文本查询(针对文本类型数据)、字段级查询(针对结构化数据的属性查询)

1》模糊匹配
请求内容 {"query": {"match": {"name": "Elastic入门"}}}
模糊匹配会自动进行关键词的拆分,这里会拆分为Elastic 和 入门2个关键词
匹配出来的结果可能有: java入门、Elastic汇编等,如果需要将其作为整体进行模糊匹配则要采用“习语匹配”查询

2》习语匹配
请求内容{"query": {"match_phrase": {"introduce": "kongfu创始人"}}}
将输入条件作为整体进行模糊匹配

3》多字段匹配
请求内容{"query": {"multi_match": {"query": "kongfu创始人","fields":["country","introduce"]}}}
从2个字段中模糊匹配查找内容(非习语匹配)

4》语法查询(查全文)
请求内容{"query": {"query_string": {"query": "(kongfu AND 创始人) OR 张"}}}
从所有字段中查关键词,也可以配合 "fields" 指定查询属性范围


结构化查询(指定属性)

  1. term与match相比都能模糊匹配,但对于长一点的text内容,term不能匹配,?
    -- 原因是es使用的默认分词器对于中文分词是切割每个汉字,不支持单词的切割,需要使用ik等中国分词器。
    {"query": {"term": {"age": 20}}}
    {"query": {"term": {"name": "张"}}}

范围查询(对数字、日期属性)
gt 大于
gte 大于等于
lt 小于
lte 小于等于
请求内容(数字)

{
    "query": {
        "range": {
            "age": {
                "gt": 25,
                "lte": 50
            }
        }
    }
}

请求内容(日期),当前日期可以用now

{
    "query": {
        "range": {
            "date": {
                "gt": "1985-01-01",
                "lte": "now"
            }
        }
    }
}

1.2 Filter context(精准)

查询过程中,只判断是否满足条件,只有yes或no
只适用于integer、date不适用于text,filter必须结合bool使用
filter会自动被缓存
请求内容

{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "age" : 20
                }
            }
        }
    }
}

2. 复合条件查询 (以一定逻辑组合子条件查询)

1. 固定分数查询

将之前匹配结果中的_score值固定下来,默认为1
请求:

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "introduce": "掌门"
                }
            }
        }
    }
}

结果:

{
    "took": 96,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
            {
                "_index": "people",
                "_type": "man",
                "_id": "4KmSWWcBRM5zB9jDk-jR",
                "_score": 1,
                "_source": {
                    "name": "张无忌",
                    "country": "China",
                    "age": 20,
                    "introduce": "明教掌门,kongfu创始人",
                    "date": "1988-9-1"
                }
            },
            {
                "_index": "people",
                "_type": "man",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "name": "张三丰",
                    "country": "少林",
                    "age": 30,
                    "introduce": "少林和武当山掌门,太极拳创始人",
                    "date": "1987-9-1"
                }
            }
        ]
    }
}

也可以指定分数:

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "introduce": "掌门"
                }
            },
            "boost":3 //用于指定匹配结果的_score值
        }
    }
}

2. 布尔查询

通过bool进行的复合查询,没太搞懂!!!
should 是多个条件满足一个就可以,相当于or
must是多个条件都要满足,相当于and,试验证明满足一个也会出现???!!!!

{
    "query": {
        "bool": {
            "should": [
            {
                "match": {
                    "name": "张三"
                }
            },
            {
                "match": {
                    "introduce": "掌门"
                }
            }
            ]
        }
    }
}

返回结果:

{
    "took": 73,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 1.1507283,
        "hits": [
            {
                "_index": "people",
                "_type": "man",
                "_id": "1",
                "_score": 1.1507283,
                "_source": {
                    "name": "张三丰",
                    "country": "少林",
                    "age": 30,
                    "introduce": "少林和武当山掌门,太极拳创始人",
                    "date": "1987-9-1"
                }
            },
            {
                "_index": "people",
                "_type": "man",
                "_id": "4KmSWWcBRM5zB9jDk-jR",
                "_score": 0.8630463,
                "_source": {
                    "name": "张无忌",
                    "country": "China",
                    "age": 20,
                    "introduce": "明教掌门,kongfu创始人",
                    "date": "1988-9-1"
                }
            }
        ]
    }
}

还可以增加filter+term进行数字值过滤

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "张三丰"
                    }
                },
                {
                    "match": {
                        "introduce": "武当"
                    }
                }
            ],
            "filter": [
                {
                    "term": {
                        "age": 20
                    }
                }
            ]
        }
    }
}

可以使用must_not进行反过滤,相当于not

{
    "query": {
        "bool": {
            "must_not": [
                {
                    "match": {
                        "name": "三丰"
                    }
                },
                {
                    "match": {
                        "introduce": "武当"
                    }
                }
            ]
        }
    }
}

相关文章

  • ES6 - 4 高级查询

    1. 子条件查询 (特点字段查询所指定值) 1.1 Query context(模糊) 1》模糊匹配请求内容 {...

  • SQL 查询命令

    一 数据库基本操作 二 高级查询 1. 新建表结构 2. 聚合查询 3. 多表查询 4. 连接查询 关于INNER...

  • 6.理解索引(中):MySQL查询过程和高级查询

    理解索引(中):MySQL查询过程和高级查询https://juejin.im/post/5b0c4f0b5188...

  • 认识Babel***

    Babel是什么?用于解析ES6,甚至比ES6更高级的语法,到ES5或ES4级别,满足浏览器的兼容性 环境搭建 &...

  • 高级查询

    SQL语句的强化求所有电脑产品的平均价格,并且保留两位小数:select round(avg(price),2) ...

  • 高级查询

    分组函数 使用方法: MIN和MAX函数:返回每组的最小或最大值 可用于任何数据类型 应用: SUM和AVG函数:...

  • 高级查询

    -5个分组函数 where 中不可以有别名,where中不能有分组函数-- 组后条件 select 语句执行过程 ...

  • 高级查询

    数据库示例: 学生信息表student 成绩表score 一、子查询 一个内层查询语句(select-from-w...

  • 高级查询

    分页和过滤查询 流程图 : 前面我们已经讲过分页查询了 , 接下来我们讲讲 过滤查询 . 思路 : 从后台开始写 ...

  • GreenDao集成教程(三) DB高级查询

    高级查询 DEMO入口

网友评论

      本文标题:ES6 - 4 高级查询

      本文链接:https://www.haomeiwen.com/subject/obrzqqtx.html