美文网首页
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 高级查询

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