一、常用操作

(1)索引库操作

1、查询es中的所有索引库

GET /_cat/indices?v

2、创建索引库(并指定ik分词器)
PUT /es_db
{
  "settings": {
        "index":{
          "analysis.analyzer.default.type":"ik_max_word"
        }
  }
}

需下载ik分词器:Releases · medcl/elasticsearch-analysis-ik · GitHub

并解压到plugins/ik文件夹下

一般创建索引库使用如下配置:

PUT /es_db
{
  "settings": {
        "index":{
          "analysis.analyzer.default.type":"ik_max_word"
        }
  },
  "mappings":{
      "properties":{
          "id":{"type":"keyword","index":true,"store":true},
          "title":{"type":"text","index":true,"store":true},
          "content":{"type":"text","index":true,"store":true}
      }
  }
}

3、查询索引库
GET /es_db

4、删除索引库
DELETE /es_db

(2)文档操作

1、添加或修改文档(根据有无id判断)
PUT /es_db/_doc/1
{
 "name":"sumengnan",
 "desc":"我爱你中国",
 "age":25
}
PUT /es_db/_doc/2
{
 "name":"张三",
 "desc":"中华人民共和国",
 "age":20
}

2、查询文档
GET /es_db/_doc/1

3、删除文档
DELETE /es_db/_doc/1

二、基础查询操作

1、查询当前类型中所有的文档
GET /es_db/_doc/_search

2、条件查询,如查询age等于20的数据
GET /es_db/_doc/_search?q=age:20

3、小于等于条件查询,例如查询年龄小于23岁的
GET /es_db/_doc/_search?q=age:<=23

4、小于大于条件查询,例如查询年龄大于23岁的
GET /es_db/_doc/_search?q=age:>23

5、范围查询,查询age在20到22之间的数据
GET /es_db/_doc/_search?q=age[20 TO 22]

6、批量id查询,例如根据多个id查询数据
GET /es_db/_doc/_mget
{
  "ids":[1,2]
}

7、分页查询 from=*&size=*
GET /es_db/_doc/_search?q=age:20&from=0&size=2

8、对结果只输出某些字段
GET /es_db/_doc/_search?_source=name,desc

9、对结果进行排序
GET /es_db/_doc/_search?sort=age:desc

三、DSL高级查询(精髓)

(1)query方式查询

说明:在es中存储的数据都会存在一个_score分值,分值越高越匹配。计算分值复杂需要一定时间

1、term不分词
GET /es_db/_doc/_search
{
  "query":{
      "term": {
         "name":"张三"
      }
    }
  }
}

2、match分词
GET /es_db/_doc/_search
{
  "query":{
      "match": {
         "desc":"中国"
      }
    }
  }
}
#match或分词:
GET /es_db/_search
{
  "query":{
      "match": {
         "desc":{
            "query":"人民 中国",
            "operator":"or"
         }
      }
    }
  }
}

3、multi_match多字段模糊匹配查询
GET /es_db/_doc/_search
{
  "query":{
      "multi_match":{
         "query":"张三",
         "fields":["name","desc"]
      }
    }
  }
}

4、query_string未指定字段查询(AND或OR大写)
GET /es_db/_doc/_search
{
  "query":{
      "query_string":{
        "query":"张三 OR 我爱你"
      }
    }
  }
}
5、query_string指定字段查询(AND或OR大写)
GET /es_db/_doc/_search
{
  "query":{
      "query_string":{
        "query":"张三 OR 我爱你",
        "fields":["name","desc"]
      }
    }
  }
}


6、range范围查询
说明:gte:大于等于,lte:小于等于,gt:大于,lt:小于,now:当前时间
GET /es_db/_doc/_search
{
  "query":{
      "range":{
         "age":{
            "gte":23,
            "lte":25
         }
      }
    }
  }
}

7、from,size分页、_source输出字段、sort排序等查询
GET /es_db/_doc/_search
{
  "from":0,
  "size":2,
  "_source":["name","desc"],
  "sort":{
    "age":"desc"
  },
  "query":{
      "match": {
         "desc":"中国"
      }
    }
  }
}

8、前缀匹配
GET /es_db/_search
{
  "query":{
      "prefix": {
        "desc.keyword": {
          "value": "我爱"
        }
      }
    }
  }
}

(2)filter方式查询

说明:不会计算相关分值,也不会对结果进行排序,效率高。查询的结果可以被缓存。
GET /es_db/_doc/_search
{
  "query":{
     "bool":{
        "filter":{
           "term":{
             "name":"张三"
           }
        }
     }
    }
  }
}

(3)bool查询

GET /es_db/_doc/_search
{
  "query":{
    "bool":{
      "must": [
        {"match": {
           "gender": "男"
        }},
        {"match":{
          "address": "中国"
        }}
      ],
      "must_not": [
        {"match":{
          "age": "18"
        }}
      ],
      "should":[
        {"match":{
          "lastname": "张"
        }}
      ]
    }
  }
}

性别是男,地址是中国,年龄不能是18,最好姓张(不是也没事,影响分值而已)

(4)通配符查询

GET /es_db/_doc/_search
{
  "query": {
      "bool": {
          "must": [
              {"wildcard": {"title": "*网*"}}
          ]
      }
  }
}

四、mapping映射有关

1、获取索引库映射信息
GET /es_db/_mapping

2、创建索引库并指定静态映射
说明:keyword不会分词(能聚合、排序),text会分词(不能聚合、排序),index建立索引,store是否存储(不存储查不到,一般只需搜索而不需展示到页面的才设置false,如地址)
PUT /es_db
{
  "mappings":{
      "properties":{
          "name":{"type":"keyword","index":true,"store":true},
          "desc":{"type":"text","index":true,"store":true},
          "age":{"type":"integer","index":true,"store":true}
      }
  }
}

附:映射字段数据类型:

1、简单数据类型:

  • 字符型:text
  • 数字型:long,integer,shrot,byte,double,float
  • 日期类型:date
  • 布尔类型:boolean
  • 二进制:binary

2、复杂数据类型:

  • 数组类型:不需要专门的类型来定义数组
  • 对象数据类型:object,单独的json对象
  • 嵌套数据类型:nested,关于json对象的数组

3、地理数据类型:

  • 地理点数据类型:geo_point,经纬度点
  • 地理形状数据类型:geo_shape,多边形的复杂地理形状

4、专门数据类型:

  • ipv4数据类型:ip协议为ipv4的地址。
  • 完成数据类型:completion,提供自动补全的建议
  • 单词计数数据类型:token_count,统计字符串中单词的数量
  • 不被分词数据类型:keyword

3、静态映射同时指定分词器(一般不用这个,指定全局的就好了)
PUT /es_db
{
  "mappings":{
      "properties":{
          "name":{"type":"keyword","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"},
          "desc":{"type":"text","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"},
          "age":{"type":"integer","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"}
      }
  }
}

五、整合springboot

(1)添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

(2)注入RestHighLevelClient

    @Autowired
    private RestHighLevelClient restHighLevelClient;

(3)插入数据

        //模拟json数据
        HashMap<Object, Object> map = new HashMap<>();
        map.put("username","sumengnan");
        map.put("password","123456");

        //创建一个批量写入请求
        BulkRequest bulkRequest = new BulkRequest();
        //索引库请求
        IndexRequest indexRequest = new IndexRequest("user","_doc");
        indexRequest.source(JSON.toJSONString(map),XContentType.JSON);
        bulkRequest.add(indexRequest);
        try {
            //bulk是批量写入
            //mget是批量读取
            BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            System.out.println(bulk.buildFailureMessage());
            if (!bulk.hasFailures()) {
                System.out.println("ok");
            }else{
                System.out.println("no ok");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

(4)查询数据

        //构建搜索请求
        SearchRequest searchRequest = new SearchRequest("user");

        //构建搜索源
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(1);
        searchSourceBuilder.size(4);
        //设置查询
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("username", "sumengnan");
        searchSourceBuilder.query(matchQueryBuilder);
        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("username");
        highlightBuilder.preTags("<span style='color:red'>");//设置前缀标签
        highlightBuilder.postTags("<span>");//设置后缀标签
        searchSourceBuilder.highlighter(highlightBuilder);

        searchRequest.source(searchSourceBuilder);//搜索源加入搜索请求

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        for (SearchHit hit : searchResponse.getHits()) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            System.out.println(sourceAsMap);
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField username = highlightFields.get("username");
            Text[] fragments = username.getFragments();
            for (Text fragment : fragments) {
                return fragment.string();
            }
        }
        return Collections.emptyMap();

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐