Elastic Search权威指南 第五章 结构化查询

来源:互联网 发布:步态分析数据 编辑:程序博客网 时间:2024/05/19 17:47

1. 请求体查询

最重要的意义:请求体查询允许我们使用结构化语言查询。

1.1 请求体查询出现的原因

简单查询语句是一种高效的查询语句,但是查出来的数据不够详细和具体,应该使用能够查询出更多内容的查询方式,请求体查询就是这样的查询。

1.2 空查询

GET /_seearch{}将会返回索引中的所有文档甚至可以查询多个索引或者类型GET /index_*/_searchGET /index_*/type1,type2...,typen/_search支持分页操作GET /_search{    "from":30,    "size":10}

2. 结构化查询

2.1 何为结构化查询

官方解释:
结构化查询是一种灵活的、多表现形式的查询语言。
我的理解:
就是一种以json为格式的查询语言,因为json语言结构的严谨性,使得查询语言看起来更加的易读且拥有丰富变换的查询格式。

2.2 结构化查询语法

{    QUERY_NAME: {           FIELD_NAME: {            ARGUMENT: VALUE,            ARGUMENT: VALUE,...        }    }}QUERY_NAME一般是"query"FIELD_NAME一般是执行的操作名称,我更喜欢标识为ACTION_NAME  比如"match"ARGUMENT一般是列名VALUE一般是值

举个栗子

GET /_search{    "query":{        "match":{            "tweet":"wushuangxiaoyu"        }    }}意义为查询所有索引及类型中,tweet字段中包含wushuangxiaoyu这个字符串的记录

2.3 查询和过滤

区别的自己理解:
过滤匹配的是确切值
查询,比较的是相关性

性能之间的区别:
过滤的结果会进行缓存
查询的结果不会进行缓存,而且要挨个匹配相关所有文档的相关性,所以查询语句更加耗时

综合考虑之:
过滤语句的目的(因为会对结果集进行缓存,方便查询语句进行相关性比较),就是缩小查询语句比较相关性的范围,提高查询语句的效率。

使用场景:
进行全文搜索或者进行相关性比较的时候使用查询
其余的情况都是使用过滤

2.4 重要且常用的查询过滤语句

term 过滤

主要用于匹配精确值,比如bool,numberdate,以及not_analyzed的字符串{    "term":{        "age":12    }}{    "term":{        "time":"2017-8-8"    }}

terms过滤

{    "terms": {        "tag": [ "search", "full_text", "nosql" ]    }}

range过滤

{    "range":{        "age":{            "lt":30,            "gte":20        }    }}gt :: 大于gte :: 大于等于lt :: 小于lte :: 小于等于

exits和missing过滤

{    "exists": {        "field": "title"    }}

bool过滤
用来合并多个过滤查询的布尔逻辑

{    "bool": {        "must": { "term": { "folder": "inbox" }},        "must_not": { "term": { "tag": "spam" }},        "should": [            { "term": { "starred": true }},            { "term": { "unread": true }}        ]    }}must:andshould:ormust_not:not

2.5 查询语句

multi_macth查询
就是一次性可以检索多个字段

"multi_macth":{    "title":"abcd",    "name":"jack"}

bool查询
与bool过滤的区别:
bool过滤会直接给出是否匹配成功的结果,但是bool查询会比较相关性

must :: 查询指定文档一定要被包含。must_not :: 查询指定文档一定不要被包含。should :: 查询指定文档, 有则可以为文档相关性加分。

3. 过滤查询

一条语句中既包含过滤,同时也包含查询

例如:

查询:"query":{    "match":{        "email":"business opportunity"    }}过滤:"filter":{    "term":{        "folder":"inbox"    }}合并:"filtered":{    "query":{        "match":{            "email":"business opportunity"        }    },    "filter":{        "term":{            "folder":"inbox"        }    }}结构化:GET /_search{    "query":{        "filtered":{            "query":{                "match":{                    "email":"business opportunity"                }            },            "filter":{                "term":{                    "folder":"inbox"                }            }        }    }    }这样子就完成了过滤查询的合并

4. 验证查询

如何验证一个ES查询语句是否合法呢

GET /_index/_type/_validate/query?explain{    查询语句}如果是错的,加上?explain关键字后还可以看到详细的错误信息举个例子:一个正确的返回信息GET /_validate/query?explain{    "query": {        "match" : {            "tweet" : "really powerful"        }    }}{    "valid" : true,    "_shards" : { ... },    "explanations" : [ {        "index" : "us",        "valid" : true,        "explanation" : "tweet:really tweet:powerful"    }, {        "index" : "gb",        "valid" : true,        "explanation" : "tweet:really tweet:power"    } ]}可以分析出来,"really powerful"这个词组,在索引"us"中被分成了"really""powerful",在索引"gb"中被分成了"really""power",因为"gb"索引使用的是english分析器。