您的位置:首页 > 其它

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

2017-08-20 18:32 337 查看

1. 请求体查询

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

1.1 请求体查询出现的原因

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

1.2 空查询

GET /_seearch
{}

将会返回索引中的所有文档

甚至可以查询多个索引或者类型

GET /index_*/_search
GET /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,number,date,以及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:and
should:or
must_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分析器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  索引 结构 搜索