ElasticSearch 查询

ES(动态创建文档会默认分词)动态创建的文档,分词是忽略大小写的,所以在值为大写时搜不到的话,可以查看文档的mapping(动态创建文档没有mapping)并修改,或把值转小写再查询

ElasticSearch查询json结构解析

{
    "took": 9,   # 搜索用时ms
    "time_out": false, # 是否超时
    "_shards": { # 分片
        "total": 3, # 一共三个分片
        "successful": 3, # 三个分片都成功
        "skipped": 0,
        "failed": 0
    },
    "hits": { # 命中数据
        "total": 1, # 查询出文档个数
        "max_score": 0.6931472, # 相关度分数 
        "hits": { # 命中文档详情
            "_index": "school", # 索引
            "_type": "student", # 文档类型
            "_id": "3", # id
            "_score": 0.6931472, # 匹配分数
            "_source": {
                "name": "lisi",
                "address": "bei jing hai dian qu qing he hen",
                "age": 12,
                "birthday": "1998-10-23",
                "interests": "xi huan hejiu,duanlian,chengge"
            }
        }
    }
}

query 基本查询

# 查询学校里学生名字为lisi的人
GET /school/student/_search?q=name:lisi
# 查询学校里学生兴趣含有changge的并且按照age降序
GET /school/student/_search?q=interests:changge&sort=age:desc

term查询和terms查询

term query 会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric(数字)、date
term 查询某个字段里含有某个关键字的文档
terms 查询某个字段里含有多个关键词的文档

# 查询学校里学生名字含有zhaoliu关键字的
GET /school/studenet/_search
{
    "query": {
        "term" : { "name":"zhaoliu" }
    }
}
# 查询学校里学生的兴趣(interests)包含 hejiu 或者 changge 的
# from,size 类似mysql分页
# version:true 显示版本号
GET /school/student/_search
{
    "from":0,
    "size":2,
    "version":true,
    "query": {
        "terms": { 
            "interests" : ["hejiu","changge" ]
         }
    }
}

match查询

match query知道分词器的存在,会对filed进行分词操作,然后再查询

# 查询学校的学生name字段含有zhaoliu或zhaoming的,并之查看 name和address字段,排除age和birthday字段
GET /school/student/_search
{
    "query":{
        "match":{
            "name" : "zhaoliu zhaoming"
        }
    },
    "_source": {
        "includes": ["na*","address"], #可以用*号通配符
        "excludes":["age","birthday"]
    }
}
# 查询学校的学生interests字段含有duanlian或changge的
GET /school/student/_search
{
    "query":{
        "match":{
            "interests" : "duanlian,changge"
        }
    }
}
# 查询学校的学生age是20的
GET /school/student/_search
{
    "query":{
        "match":{
            "age" : 20
        }
    }
}
# 查询学校的所有学生
GET /school/student/_search
{
    "query":{
        "match_all":{}
    }
}
# 查询学校学生 interests 或 name 含有 changge 的
GET /school/student/_search
{
    "query":{
        "multi_match":{
            "query": "changge",
            "fields": [ "interests","name" ]
        }
    }
}
# multi_phrase(短语匹配)查询学校学生 interests 含有完整的字符串 "duanlian.changge"的语句
GET /school/student/_search
{
    "query":{
        "multi_phrase":{
            "interests": "duanlian.changge"
        }
    }
}
# multi_phrase(短语匹配)查询学校学生 interests 含有完整的字符串 "duanlian.changge"的语句 , 并之查看 address 和 name 字段
GET /school/student/_search
{
    "_source":["address","name"],
    "query":{
        "multi_phrase":{
            "interests": "duanlian.changge"
        }
    }
}
# 查询学校的所有学生,并排序
GET /school/student/_search
{
    "query":{
        "match_all":{}
    },
    "sort":[
        {
            "age":{"order":"asc"} # desc
        }
    ]
}
# 前缀匹配 name 字段中以 zhao开头的
GET /school/student/_search
{
    "query":{
        "match_phrase_prefix":{
            "name" : {
                "query": "zhao"
            }
        }
    }
}
# 范围匹配  查询出生日期从 from 到 to的
GET /school/student/_search
{
    "query":{
        "range":{
            "birthday" : {
                "from": "1990-10-10",
                "to": "2018-05-11",
                "include_lower":true, # 包含from 本身的值 from >= "1990-10-10"
                "include_upper":false # 不包含to 本身的值 to < 2018-05-11
            }
        }
    }
}

wildcard 查询

允许使用通配符和?来进行查询,代表0个或任意多个字符,?代表任意一个字符

GET /school/student/_search
{
    "query":{
       "wildcard":{ "name": "zhao*" }
    }
}
GET /school/student/_search
{
    "query":{
       "wildcard":{ "name": "zha?liu" }
    }
}

fuzzy 模糊查询

value 查询的关键子
boost 查询的权重 默认是1.0
min_similarity 设置匹配的最小相似度,默认值未0.5 ,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天
prefix_length 指明区分词项的共同前缀长度,默认是0
max_expansions 查询中的词项可以扩展的数目,默认可以无限大

# 模糊查询 会找到之前name为zhaoliu的数据,或其他匹配数据
GET /school/student/_search
{
    "query":{
       "fuzzy":{ "name": "zholiu" }
    }
}
# 模糊查询  
GET /school/student/_search
{
    "query":{
        "fuzzy":{ 
            "interests":  {
                "value":"chagge"
            }
        }
    }
}

高亮搜索结果

# 查询interests包含 changge的,让其interests字段被高亮,查询出的数据会被加changge标签
GET /school/student/_search
{
    "query":{
        "match":{ 
            "interests": "changge"
        }
    },
    "highlight":{
        "fields': {
            "interests":{}
        }
    }
}

filter 查询

filter 是不计算相关性的,同时可以cache。因此,filter速度要快于Query

# 查询age 为 20的学生
GET /school/student/_seach
{
    "query":{
        "bool" : {
            "filter":[
                { "term" : {"age":20} }
            ]
        }
    }
}
# 查询age 为16 和 20 的学生
GET /school/student/_seach
{
    "query":{
        "bool" : {
            "filter":[
                { "terms" : {"age": [16,20] } }
            ]
        }
    }
}

bool 过滤查询

可以实现组合过滤查询
must 必须满足的条件 -- and
should 可以满足也可以不满足 -- or
must_not 不需要满足的条件 -- not

# 查询age 为25 或者 name 为 zhangsan,但age一定不是18
GET /school/student/_search
{
    "query":{
        "bool" : {
            "should" : [
                {"term":{"age":25}},
                {"term":{"name":"zhangsan"}}
            ],
            "must_not": {
                "term":{"age":18}
            }
        }
    }
}
# 查询age 为25的,或者 name 为 wangwu 并且 age 为 23的,该查询也算是复合查询
复合查询 就是将多个基本查询组合成单一的查询
GET /school/student/_search
{
    "query":{
        "bool" : {
            "should" : [
                {"term":{"age":25}},
                {
                    "bool":{
                        "must":[
                            {"term":{"name":"wangwu"}},
                            {"term":{"age":23}}
                        ]
                    }
                }
            ]
        }
    }
}
# 查询address 不为空的
GET /school/student/_search
{
    "query":{
        "bool" : {
            "filter": {
                "exists":{"field":"address"}
            }
        }
    }
}

范围过滤

gt > , lt < ,gte >= ,lte <=

# 查询  18

你可能感兴趣的:(ElasticSearch 查询)