简单查询
全文搜索
GET localhost:9200/my_doc/_search
这样查询会把my_doc索引的所有文档全部查出来。
QueryString查询
GET localhost:9200/my_doc/_search?q=desc:他很帅&q:age:20
proerties的desc属性和age属性对应的查出来
复杂查询
match匹配
支持全文搜索和精确查询,取决于字段是否支持全文检索
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match":{
"desc":"大学学生"
}
}
}
match的默认会分词匹配带有大学或者学生这两个内容,本质上是or,只要匹配其中一个就会查询到。那如果我们想全部条件都匹配上呢?通过operator来实现,
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match":{
"desc":{
"query":"大学学生",
"operator":"and"
}
}
}
}
也可以按照匹配比例来查询,最小匹配比例百分之60
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match":{
"desc":{
"query":"大学学生",
"minimum_should_match":"60%"
}
}
}
}
exists匹配
仅展示存在该字段且值不为空的数据
POST localhost:9200/my_doc/doc/_search
{
"query":{
"exist":{
"field":"username"
}
}
}
match_all全部匹配
把my_doc索引的所有文档全部查出来。这样查询与上文的全文查询效果差不多,但是如果你要设定分页,查询的字段等则可以自定义dsl查询
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match_all":{
}
}
}
查询指定的field
_source可以指定查询出来的结果只显示指定的field
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match_all":{
}
},
"_source":[
"id",
"nickname"
]
}
分页查询
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match_all":{
}
},
"_source":[
"id",
"nickname"
],
"from":0,
"size":10
}
term和terms完全匹配
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。
POST localhost:9200/my_doc/doc/_search
{
"query":{
"term":{
"desc":"他很帅"
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
terms查询与term查询一样,但它允许你指定多直进行匹配,如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
POST localhost:9200/my_doc/doc/_search
{
"query":{
"terms":{
"desc":["他很帅","学习"]
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
match_phrase查询
短语查询,精确匹配,查询大学毕业会匹配desc字段包含大学 毕业短语的,而不会进行分词查询,也不会查询出包含大学 其他词 毕业这样的文档,必须是连贯的内容
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match_phrase":{
"desc":{
"query":"大学 毕业"
}
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
slop可以短语匹配中跳过词的数量
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match_phrase":{
"desc":{
"query":"大学 毕业",
"slop":2 }
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
ids查询
多个id查询,_id为1001和1002都可以被查询出来
POST localhost:9200/my_doc/doc/_search
{
"query":{
"ids":{
"type":"_doc",
"values":["1001","1002"]
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
multi_match查询
多字段查询,比如查询color和ad字段包含单词red的文档
POST localhost:9200/my_doc/doc/_search
{
"query": {
"multi_match": {
"query": "red",
"fields": ["color","ad"]
}
}
}
还可以给他们设置权重,比如以color字段为主来排序。通过^来设置boost权重
{
"query": {
"multi_match": {
"query": "red",
"fields": ["color","ad^10"]
}
}
}
range查询
范围查询,查询价格小于1000小于50的文档
POST localhost:9200/my_doc/doc/_search
{
"query":{
"range":{
"money":{
"lt":100,
"gt":50
}
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
post_filter后置过滤器查询
和根据条件直接检索出来数据不同,post_filter会根据query检索出来的结果再进行过滤,不会计算分数相关度。如查询money字段50-100之间的数据,你也可以使用term,match等再进行过滤
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match":{
"desc":"学生"
}
},
"post_filter":{
"range":{
"money":{
"lt":100,
"gt":50
}
}
},
"_source":[
"id",
"nickname",
"desc"
]
}
排序
查询默认的排序会根据score进行排序,自定义排序通过sort来实现,如下会根据age倒序,money正序来排序。但是不能对text等类型进行排序,对text类型排序需要设置附属属性。
POST localhost:9200/my_doc/doc/_search
{
"query":{
"match":{
"desc":"学生"
}
},
"sort":[
{
"age":"desc"
},
{
"money":"asc"
}
]
}
高亮hightlight
对搜索的词汇进行高亮显示,会对分词搜索到的学生进行高亮,默认使用em标签,也可以自定义高亮的标签。
{
"query":{
"match":{
"desc":"学生"
}
},
"hightlight":{
"pre_tags":["<span>"],
"post_tags":["</span>"],
"fields":{
"desc":{}
}
}
}