赞
踩
# 默认情况下,es一次展示10条数据,通过from和size来控制分页 # 索引goods的查询 GET goods/_search { "query": { "match_all": {} }, "from": 0, "size": 100 } #如果没有查询条件也可以使用最简单的 GET goods/_search #结果示例 { "took": 5, "timed_out": false, "_shards": { "total": 2, "successful": 2, "skipped": 0, "failed": 0 }, "hits": {//查询结果的统计对象 "total": 5545,//命中数 "max_score": 2.239803,//最大得分 "hits": [//具体的查询数据 { "_index": "goods", "_type": "data", "_id": "d6d5cba0b5ef4b20bc995d07418ae533", "_score": 2.239803, "_source": { "PXH": "0", "ZLTYPEJC": "问题解答" } } ] } }
GET goods #text:会分词,不支持聚合 #keyword:不会分词,将全部内容作为一个词条,支持聚合 #可参考https://www.cnblogs.com/candlia/p/11920029.html #https://blog.csdn.net/qq_32165041/article/details/83688593 #结果示例 { "goods": { "aliases": {}, "mappings": { "data": { "properties": { "BQID": { "type": "keyword", "ignore_above": 10922 }, "IVRCONTENT": { "type": "text", "fields": {//fields可以让同一文本有多种不同的索引方式, //比如一个String类型的字段,可以使用text类型做全文检索,使用keyword类型做聚合和排序。 "keyword": {//类似子名字,随便取得,用的时候IVRCONTENT.field "type": "keyword", "ignore_above": 10922//ignore_above用于指定字段索引和存储的长度最大值 } }, "analyzer": "standard" } } } }, "settings": { "index": { "number_of_shards": "2",//数据所在分片 "provided_name": "goods", "max_result_window": "98854", "creation_date": "1631065422638", "number_of_replicas": "0", "uuid": "VTTVR9blTXiTJgFmJMxLdQ", "version": { "created": "5061299" } } } } }
词条查询:term
词条查询不会对==查询条件==分词,只有当词条和查询字符串完全匹配时才匹配搜索。适合查询type为keyword这种类型的数据。
# term查询,只会查询title里有“华为”两字的数据,不会查询title里只有“华”或“为”的结果
GET goods/_search
{
"query": {
"term": {
"title": {//字段名
"value": "华为"//字段值
}
}
}
}
全文查询:match
全文查询会对查询条件分词,先将查询条件进行分词,然后查询,默认求并集(or)
# match查询 # 如果查询的是keyword类型数据,那么完全匹配的数据也能被查询,比如有个keyword字段的值是“问题查询”,那么 # macth查询的时候“问题”、“查询”都不能查到该数据,但“问题查询”可以查到。 # 还有一个matchphrase,查询keyword类型数据与match一样,查询text类型数据时, # match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。 # 例如,用“i am Chinese”查询时,“i am”、“ am Chinese”都能匹配,但“i Chinese”、“Chinese am” 不能匹配。 # 它与后面的queryString的区别就是后者不要求顺序 # 可参考https://blog.csdn.net/albertfly/article/details/100705554 # 如果是查询的是nested嵌套对象里的字段可参考:https://learnku.com/articles/54331 GET goods/_search { "query": { "match": { "title": "华为手机" } }, "size": 500 } #可以指定为and操作 GET goods/_search { "query": { "match": { "title": { "query": "华为手机", "operator": "and"//交集 } } } }
ES默认的分词器对中文不友好,需要安装IKAnalyzer插件支持中文分词。
IK分词器有两种分词模式:
#可以通过以下命令来查看分词效果 GET /_analyze { "analyzer": "standard", "text": "我爱北京天安门" } GET _analyze { "analyzer": "ik_max_word", "text": "我爱北京天安门" } GET _analyze { "analyzer": "ik_smart", "text": "我爱北京天安门" }
# wildcard 查询。查询条件分词,模糊查询,查询的字段既可以是keyword也可以是text # 如果title是text类型数据,那么查询时会对“华为”进行分词,导致查询结果不正确,甚至查询不到结果,此时可以使用fileds给title # 添加一个keyword类型的别名,然后用title.别名 查询 GET goods/_search { "query": { "wildcard": { "title": { "value": "华为*" } } } } # 正则查询 GET goods/_search { "query": { "regexp": { "title": "\\w+(.)*" } } } # 前缀查询,与item查询的区别是keyword类型的数据用使用第一个字的话,前缀查询可以查到,用item查询无结果 GET goods/_search { "query": { "prefix": { "brandName": { "value": "三" } } } }
# 范围查询 GET goods/_search { "query": { "range": { "price": { "gte": 2000, "lte": 3000 } } }, "sort": [ { "price": { "order": "desc" } } ] }
# queryString,类似于mysql里的条件查询 # 对于keyword类型的数据,需要完全匹配才能查询到 # 对于text类型的数据,会根据分词结果查询。 GET goods/_search { "query": { "query_string": { "fields": ["title","categoryName","brandName"], "query": "华为手机"//将"华为手机"分词后依次从"title","categoryName","brandName" //三个属性中查询,默认是and,可以写成“华为 or 手机” } } } GET goods/_search { "query": { "simple_query_string": { "fields": ["title","categoryName","brandName"], "query": "华为手机"//不支持and or 连接符 } } }
# boolquery 布尔查询 #must(and):条件必须成立 #must_not(not):条件必须不成立 #should(or):条件可以成立 #filter:条件必须成立,性能比must高。不会计算得分,可以用constant_score包裹查询条件,用boost指定分数(Float) #es相关度计算参考https://blog.csdn.net/miaomiao19971215/category_9729020.html, # https://blog.csdn.net/ma15732625261/article/details/79537287 #must,filter内按照正常的查询写即可,利用exist可判断字段是否为null或不存在,,如果是嵌套nested类型可参考 # https://blog.csdn.net/TinyNasubi/article/details/101285893,其中的path属性就是对象名 GET goods/_search { "query": { "bool": { "must": [ { "term": { "brandName": { "value": "华为" } } } ], "filter":[ { "term": { "title": "手机" } }, { "range":{ "price": { "gte": 2000, "lte": 3000 } } } ] } } } GET goods/_search { "query": { "bool": { "filter": [ { "term": { "brandName": { "value": "华为" } } } ] } } }
•指标聚合,相当于MySQL的聚合函数。max、min、avg、sum等
•桶聚合,相当于MySQL的 group by 操作。不要对text类型的数据进行分组,会失败。
# 聚合查询,注意!!!聚合结果在正常的查询结果后面的aggregation部分 # 指标聚合 聚合函数 GET goods/_search { "query": {//查询部分 "match": { "title": "手机" } }, "aggs": {//聚合部分 "max_price": {//聚合结果别名 "max": {//指标聚合类型 "field": "price"//字段类型要为number } } } } # 桶聚合 分组 GET goods/_search { "query": { "match": { "title": "手机" } }, "aggs": { "goods_brands": {//别名 "terms": { "field": "brandName",//桶聚合字段 "size": 10//分组结果中展示的数量,比如按brandName分组共有20组,这个设置就是在结果中显示10组 } } } }
# !!!结果在最后的highlight部分,对结果中title属性值的“电视”俩字加前后缀 GET goods/_search { "query": { "match": { "title": "电视" } }, "highlight": { "fields": { "title": {//字段名 "pre_tags": "<font color='red'>",//默认的前后缀是<em></em> "post_tags": "</font>" } } } } # 也有这样写的,这种写法kibana里会有提示 GET goods/_search { "query": { "match": { "title": "电视" } }, "highlight": { "fields": { "title": {} }, "pre_tags": "<font color='red'>", "post_tags": "</font>", "fragment_size": 10 } }
# -------重建索引----------- # 新建student_index_v1。索引名称必须全部小写 PUT student_index_v1 { "mappings": { "properties": { "birthday":{ "type": "date" } } } } GET student_index_v1 PUT student_index_v1/_doc/1 { "birthday":"1999-11-11" } GET student_index_v1/_search PUT student_index_v1/_doc/1 { "birthday":"1999年11月11日" } # 业务变更了,需要改变birthday字段的类型为text # 1. 创建新的索引 student_index_v2 # 2. 将student_index_v1 数据拷贝到 student_index_v2 # 创建新的索引 student_index_v2 PUT student_index_v2 { "mappings": { "properties": { "birthday":{ "type": "text" } } } } # 将student_index_v1 数据拷贝到 student_index_v2 # _reindex 拷贝数据 POST _reindex { "source": { "index": "student_index_v1" }, "dest": { "index": "student_index_v2" } } GET student_index_v2/_search PUT student_index_v2/_doc/2 { "birthday":"1999年11月11日" } # 思考: 现在java代码中操作es,还是使用的实student_index_v1老的索引名称。 # 1. 改代码(不推荐) # 2. 索引别名(推荐) # 步骤: # 0. 先删除student_index_v1 # 1. 给student_index_v2起个别名 student_index_v1 # 先删除student_index_v1 DELETE student_index_v1 # 给student_index_v2起个别名 student_index_v1 POST student_index_v2/_alias/student_index_v1 GET student_index_v1/_search GET student_index_v2/_search
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。