三、复杂搜索

# 查询所有索引的文档
GET _search
GET /_all/_search

# 查询特定索引
GET (_index)/_search

# 查询多个索引
POST /index1,index2,index3/_search

# 查询多个index开头的索引,但排除index3
POST /index*,-index3/_search

# 获取第2页的5个文档
GET _search?size=5&from=2

# 通过_source定义要搜索的字段
# 而如果 _source是空列表[],则返回所有字段
GET twitter/_search
{
  "_source": ["user", "city"],
  "query": {
    "match_all": {
    }
  }
}
# 使用fields而不是用_source的话,这样更高效
GET twitter/_search
{
  "_source": false,
  "fields": ["user", "city"],
  "query": {
    "match_all": {
    }
  }
}
GET index/type/_search
{
    "query":{
        "match":{    # 匹配条件,这里支持模糊匹配
            "field_1":"value_1"
        },
    },
    "sort":[
        {    # 排序字段
           "field_1":{
            "order":"asc"
            } 
        } 
    ],
    "from": 0,    # 从第几个数据开始
    "size": 1    # 返回的数据条数
}
# 多条件匹配与过滤
# must:满足每个match条件,即and
# must_not
# should则可以理解为or
GET index/type/_search
{
    "query":{
        "bool":{    
            "must":[    
                {
                   "match":
                    {    
                        "field_1":"value_1"
                    }
                },
                {
                   "match":
                    {    
                        "field_2":"value_2"
                    }
                }
            ],
            # 过滤
            # range  满足范围条件的字段
            # gt     大于
            # gte     大于等于
            # lt     小于
            "filter":{
                "range":{
                    "field_1":{
                        "gte":"value_1",
                        "lt":"value_2",
                    }
                }
            }
        }
    }
}

term 查询是直接通过倒排索引指定的词条进行精确查找的

几个搜索语句的区别

1、term不会对value进行分词处理,输入的什么就匹配的什么,并且若key是能被分词的类型,则value必须是分词结果中的一个

2、而match会对条件value进行分词。

1、full text query 全文查询

match

标准匹配查询以匹配提供的文本、数字、日期或布尔值。对查询字符串进行分析,并获取词汇单元,然后将各个词汇单元根据参数operator(默认为or)进行匹配及布尔运算,获得最终匹配结果。

会对提供的查询条件进行分词。

{
    "query":{
        "match":{
            "field_1": {
                "query": "value_1",
                // 可配合query参数同时使用的常用参数
                "lenient": true, // 忽略基于格式的错误,例如数字字段提供文本查询值,默认为false
                "operator": "AND", // 对于词汇单元的匹配模式,默认为“OR”,
                "minimum_should_match": 1, // 对词汇单元的最小匹配个数
                "zero_term_query": "all", // 如果查询字符串通过分析器后没有产生词汇单元,那应该如何返回查询结果。默认为none,不返回数据

                "analyzer": "对查询字符串指定分析器", 
                "fuzziness": 1 , // 用模糊匹配来查询分词过后的单元词汇
                "prefix_length": 1,  // 模糊匹配时,对于查询字符串所产生的词汇单元,需要固定开始字符数的个数,默认为0
                "fuzzy_transpositions": false, // 模糊匹配时,对于字符串所产生的词汇单元,允许相邻两个字符换位匹配,默认为true
                "max_expansions": 2, // 模糊匹配时,对于字符串所产生的词汇单元最大个数,默认为50    
            } 
        }
    }
}
match_bool_prefix

会对查询字符串使用analyzer分词器处理为多个term,然后基于这些个term进行bool query,除了最后一个term使用前缀查询 其它都是term query。

{
    "query": {
        "match_bool_prefix" : {
            "message" : "quick brown f"
        }
    }
}

/* 等价于 */
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "message": "quick" }},
                { "term": { "message": "brown" }},
                { "prefix": { "message": "f"}}
            ]
        }
    }
}

// 可用参数
{
    "operator": "AND",// 对于词汇单元的匹配模式,默认为“OR”,
    "minimum_should_match": 1, // 对词汇单元的最小匹配个数
    "analyzer": "对查询字符串指定分析器"
}
match_phrase

对查询字符串使用analyzer分词器处理为多个term,然后将各个term连接生成一个新的string来匹配搜索文本字段。

或者说用输入的原查询字符串来匹配

/* 
可以使用参数slop(默认为0)来允许匹配项的字符之间的间隔差,这个字符是指匹配项经分词器之后的term。
比如查询字符串 query = "5ETF",目标字符串是 "5G50ETF",该目标字符串的terms=["5", "G", "50", "ETF"],其中"5"和"ETF"间隔2,所以当slop=0或者1时,无法匹配到,当slop=2时可以匹配 
*/

// 可用参数
{
    "minimum_should_match": 1, // 对词汇单元的最小匹配个数
    "analyzer": "对查询字符串指定分析器"
}
match_phrase_prefix
mutli_match
// 可用参数
{
    "type": "best_fields"
    /*
    best_fields           根据得分对结果进行降序排序
    most_fields           按总得分排序
    cross_fields           匹配多个term的文本查询结果时,必须存在至少一个字段才算文档为匹配
    phrase                  同best_fields,但查询方式为 match_phrase
    phrase_prefix         同best_fields,但查询方式为 match_phrase_prefix
    bool_prefix              同best_fields,但查询方式为 match_bool_prefix
    */
}

query string query

可以细分为两种子类型:query_sring 和 simple_query_sring。她们使用不同的analyzer来处理查询字符串。当查询字符串不符合analyzer语法时,query_string会引发异常,而simple_query_string会丢弃无效部分继续执行。

query_sring
simple_query_sring

interval query

与span query类似,根据定义的匹配规则返回结果。根据所用的查询规则或对象,可分为五个类型

{
    "query": {
        "intervals": {
            "field_1": {
                // 1.match,可根据对查询文本单词的ordered(顺序)和max_gaps(间隔)返回
                "match": {
                    "query": "value1",
                    "analyzer": "",
                    "max_gaps": 1, // 匹配时词之间允许的最大间隔、偏移量,默认为-1没有限制。
                    "ordered": false, // 匹配字词必须按单元词汇的顺序,默认为false
                    "use_field": "field_2" // 如果指定此参数值,则匹配该值的字段,而不是匹配intervals的字段field_1
                },

                // 2.prefix,查询的字符串不再分词,完全匹配,可以在文本最多产生128个匹配。如果超过则算作错误.
                // prefix的参数只对英文和数字有效,对汉字无效
                "prefix": {
                    "prefix": "value1",
                    "analyzer": "",
                    "use_field": "field_2" // 如果指定此参数值,则匹配该值的字段,而不是匹配intervals的字段field_1
                },

                // 3.wildcard,使用通配符规则匹配,可以在文本最多产生128个匹配。如果超过则算作错误.
                "wildcard": {
                    "pattern": "value1",
                    "analyzer": "",
                    "use_field": "field_2" // 如果指定此参数值,则匹配该值的字段,而不是匹配intervals的字段field_1
                },

                // 4.all_of

                // 5.any_of

            }
        }
    }
}

2、term query 词条级别搜索

3、compound query 复合查询

用于组合多个子句以构建复杂的查询。

bool

/*
bool query使用
must(and),should(or), must_not(not)
组合查询子句
*/
{
    "query":{
        "bool":{
            "must":{
                "range":{
                    "field_1":{
                        "gte":0.1,
                        "lte":0.2
                    }
                }
            },
            "must_not":{
                "range":{
                    "field_2":{

                    }
                }
            }
        }
    }
}

高亮查询

GET index/_doc/_search
{    
    "query":{    
        "match":{
            "field_1": "value"
        }
    },
    "highlight":{    # 设置高亮字段
        # pre/post_tags可以自定义高亮的html格式,否则默认<em>
        "pre_tags": "<p class='key' style='color:red'>",
        "post_tags": "<\p>"
        "fields":{
            "field_1":{}
        }
    }
}

四、聚合

聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)

语法

"aggregations" : {                        //也可简写为 aggs
    "<aggregation_name>" : {      // 聚合的名字
        "<aggregation_type>" : {     //聚合的类型
            <aggregation_body>      //聚合体:对哪些字段进行聚合
        }
        [,"meta" : {  [<meta_data_body>] } ]?                 //元
        [,"aggregations" : { [<sub_aggregation>]+ } ]?   //在聚合里面在定义子聚合
    }
    [,"<aggregation_name_2>" : { ... } ]*                      //聚合的名字
}

aggregation_type

1、矩阵统计:matrix_stats

返回字段:

field

中文名

count

计数

mean

均值

variance

方差

skewness

偏度

kurtosis

峰度

covariance

协方差

correlation

相关性

2、常见度量指标

"""
1.最大值            max
2.最小值            min
3.总和            sum
4.值计数            value_count    
5.平均值            avg
6.加权平均值           weighted_avg
7.基数             cardinality
8.统计             stats
9.扩展统计            extended_stats
10.中位数绝对偏差      median_absolute_deviation
11.百分位             percentiles
12.百分位等级        percentile_ranks
13.地理重心            gep_centroid
14.地理边界            geo_bounds
15.最热点             top_hits
16.脚本时度量指标       scripted_metric
"""

3、bucket聚合

TODO