「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
term和match的区别?
- match
- matchPhrase
- queryString
- term,未被分词的字段进行精准匹配。被分词的字段需要某一部分精准匹配(keyword不会被分词,text会被分词)
term和match的查询方式与keyword和text写入类型进行交叉匹配
查询方式 | 写入类型 | 解释 |
---|---|---|
term | keyword | 两者都不会分词,必须要完全一致才能匹配成功 相当于mysql中的 = |
term | text | term不会被分词,但是text会被分词,只要term的值满足text中存储的值的一部分即可匹配成功,hello ->hello world |
match | keyword | match会分词,keyword不会分词,必须match分词的一个完全匹配到keyword的参数才行。例如hello world ->hello |
match | text | 两者都分词,只要分词的有一个能相互匹配上就可以,例如hello world ->hello kangkang |
match和matchPhrase的区别?
match将查询的词拆分之后只要满足其中一个就可以返回
matchPhrase将查询的词拆分后,必须拆分后的所有都匹配(且相邻)到才返回查询的数据
比如,我本来是想查询“我的”,这个词,结果你用“的”给我匹配出来一大堆,那不行。必须是使用“我”匹配出来,“的”也能匹配出来,且两个分词是相邻的。
term和terms的区别
同一个查询条件,允许匹配多个值,也就是结果是in的关系
比如,我既喜欢红色又喜欢蓝色
es实现调用
{
"query":{
"term":{
"name":"coderymy"
}
}
}
{
"query":{
"terms":{
"color":["red","blue"]
}
}
}
select * from person where color in ("red","blue")
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("coupon.coupon_type", new int[]{1, 9}))
嵌套查询
使用场景:需要的查询条件在index中的一个list对象中,或者不在当前index对象中而在在一级。总之就是index中无法直接获取查询条件进行处理
关键字:nested
官方案例(适配):
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "eggs"
}
},
{
"nested": {
"path": "coupon",
"query": {
"bool": {
"must": [
{
"term": {
"coupon.couponId": 123
}
},
{
"term": {
"coupon.couponType": 2
}
}
]
}
}
}
}
]
}}}
BoolQueryBuilder builder=QueryBuilders.boolQuery();
builder.must(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("coupon.coupon_type", 2)));
builder.must(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("coupon.coupon_id", 123)));
builder.must(QueryBuilders.nestedQuery("coupon",builder,ScoreMode.Total));
分析:
1. 查询中,nested和match(term)是一个级别的,其参数包含“path”、“QueryBuilder”
2. 其中的QueryBUilder就是一个正常的一个builder,也就是其中的json信息拿出来就是一个完整的es查询条件
3.
多条件查询
关键字:“bool”
{
"query":{
"bool":{
"must":[{
"term":{
"age":"22"
}
},{
"term":{
"sex":"girl"
}
}]
}
}
}