elasticsearch简单查询和聚合查询
组合聚合查询csdn地址
- 创建QueryBuilder(即设置查询条件)这儿创建的是组合查询(也叫多条件查询),
- 后面会介绍更多的查询方法
- 组合查询BoolQueryBuilder
- must(QueryBuilders) :AND
- mustNot(QueryBuilders):NOT
- should: :OR
模糊查询
我们都知道在ES中如果我们想要实现MySQL中的like查询的时候可以使用wildcard 通配符来进行操作。其中?代表任意一个字符*代表任意的一个或多个字符。操作语句如下
#模糊查询,比如查询李世民
GET booke/member/_search
{"query": {
"wildcard":{
"senderName": "李*"
}
}
}
#模糊查询,比如查询李政,PS:查不出李世民
GET booke/member/_search
{"query": {
"wildcard":{
"senderName": "李?"
}
}
}
- java
boolQueryBuilder.should(QueryBuilders.wildcardQuery("word", "*" + obj + "*"));
但是在最近的项目中我遇到一个问题,我在使用模糊查询的时候比如我想查“马克思”这个名字的时候,我输入“马”或者“思”的时候都能查出来但是输入“马克*”或者直接“马克思”的时候却查不出来,后面经过查询官方文档的时候才发现,我们在使用wildcard进行模糊查询的时候他默认是会你要查询的字段进行分词查询的 所以“马克思”这三个字很可能就被分词成了三个字 但是却没有连起来的分词 这就导致你查询不出来的原因。
解决办法:
我们在使用wildcard模糊查询的时候如果不想对字段内容进行分词查询的话可以将内容变成keyword模式去查询,这样我们进行查询的时候就不会进行分词查询了
短语匹配
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
结果
{
...
"hits": {
"total": 1,
"max_score": 0.23013961,
"hits": [
{
...
"_score": 0.23013961,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
}
]
}
}
聚合查询
终于到了最后一个业务需求:支持管理者对员工目录做分析。
Elasticsearch 有一个功能叫聚合(aggregations),允许我们基于数据生成一些精细的分析结果。
聚合与 SQL 中的 GROUP BY 类似但更强大。
例子: all_interests自己定义的聚合名称
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
直接看看结果:
{
...
"hits": { ... },
"aggregations": {
"all_interests": {
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "forestry",
"doc_count": 1
},
{
"key": "sports",
"doc_count": 1
}
]
}
}
}
可以看到,两位员工对音乐感兴趣,一位对林业感兴趣,一位对运动感兴趣。这些聚合的结果数据并非预先统计,而是根据匹配当前查询的文档即时生成的。如果想知道叫 Smith 的员工中最受欢迎的兴趣爱好,可以直接构造一个组合查询:
GET /megacorp/employee/_search
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}