elasticsearch使用杂记

648 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

term和match的区别?

  • match
  • matchPhrase
  • queryString
  • term,未被分词的字段进行精准匹配。被分词的字段需要某一部分精准匹配(keyword不会被分词,text会被分词)

term和match的查询方式与keyword和text写入类型进行交叉匹配

查询方式写入类型解释
termkeyword两者都不会分词,必须要完全一致才能匹配成功
相当于mysql中的=
termtextterm不会被分词,但是text会被分词,只要term的值满足text中存储的值的一部分即可匹配成功,hello->hello world
matchkeywordmatch会分词,keyword不会分词,必须match分词的一个完全匹配到keyword的参数才行。例如hello world->hello
matchtext两者都分词,只要分词的有一个能相互匹配上就可以,例如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"
                }
            }]
        }
    }
}