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