ES完整查询示例:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "spring框架",
"minimum_should_match": "50%",
"fields": ["name^10", "description"]
}
},
{
"term": {
"studymodel": "201001"
}
}
],
"must_not": [],
"should": [],
"filter": [
{
"range": {
"price": {
"gte": 0,
"lte": 100
}
}
}
],
"highlight": {
"pre_tags": ["<tag1>"],
"post_tags": ["</tag2>"],
"fields": {
"name": {},
"description": {}
}
}
}
},
"from": 0,
"size": 10,
"_source": ["name", "studymodel", "description", "price"],
"sort": [
{"studymodel": "desc"},
{"price": "asc"}
],
"aggs": {}
}
查询属性说明:
query
es查询,为es查询的条件,具体见“es常用查询”
from
开始索引
size
查询文档的数量
_source
查询文档中的字段feild列表
sort
排序字段及方式
aggs
结果聚合,如count、sum、agv等,类似于sql中的聚合函数
ES常用的查询
TermQuery
Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。
{
"query": {
"term" : {
"name": "spring"
}
}
}
MatchQuery
match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索。 match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。
{
"query": {
"match" : {
"description" : {
"query" : "spring开发",
"operator" : "or"
}
}
}
}
MultiQuery
MultiQuery,一次可以匹配多个字段。
{
"query": {
"multi_match" : {
"query" : "spring框架",
"minimum_should_match": "50%",
"fields": [ "name^10", "description" ]
}
}
}
- name^10,表示name字段的 boost 权重提升10倍。
布尔查询boolQuery
布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来。
- must:表示必须,多个查询条件必须都满足。
- should:表示或者,多个查询条件只要有一个满足即可。
- must_not:表示非。
SearchQuery 总结
org.elasticsearch.index.query.QueryBuilders
queryName | 说明 | 关键词分词 |
---|---|---|
matchAllQuery | 查询所有 | |
matchQuery | 分词 | |
multiMatchQuery | 分词 | |
matchPhraseQuery | 不 | |
matchPhrasePrefixQuery | 不 | |
idsQuery | 根据_id查询文档 | |
termQuery | 匹配term | 不 |
termsQuery | 匹配任何一个term | 不 |
fuzzyQuery | 模糊,相似(自动判断) | |
prefixQuery | start with | |
rangeQuery | 范围(gt、lt、gte、lte) | |
wildcardQuery | 模糊(*匹配任意、?匹配单个字符) | |
regexpQuery | k.*y 匹配 ky、key | |
queryStringQuery | 编写query_string(不推荐) | |
simpleQueryStringQuery | 编写query_string | |
existsQuery | 存在某个字段 | |
Term查询不会对字段进行分词查询,会采用精确匹配。
Match会根据该字段的分词器,进行分词查询。
es中有以上常用的查询,bool查询就是使用must、should、must_not组合以上各个查询的查询方式。
ES中query与filter的区别
- query会对搜素导的记录计算score值,filter不会
- query的记录不会被缓存,filter则会
- query的速度较慢,filter比较快