根据term,match等查询方式去删除大量的文档
Ps:如果你需要删除的内容,是index下的大部分数据,推荐创建一个全新的index,将保留的文档内容,添加到全新的索引
- # delete-by-query
- POST /sms-logs-index/sms-logs-type/_delete_by_query
- {
- "query": {
- "range": {
- "fee": {
- "lt": 4
- }
- }
- }
- }
- // Java代码实现
- @Test
- public void deleteByQuery() throws IOException {
- //1. 创建DeleteByQueryRequest
- DeleteByQueryRequest request = new DeleteByQueryRequest(index);
- request.types(type);
-
- //2. 指定检索的条件 和SearchRequest指定Query的方式不一样
- request.setQuery(QueryBuilders.rangeQuery("fee").lt(4));
-
- //3. 执行删除
- BulkByScrollResponse resp = client.deleteByQuery(request, RequestOptions.DEFAULT);
-
- //4. 输出返回结果
- System.out.println(resp.toString());
-
- }
bool查询
复合过滤器,将你的多个查询条件,以一定的逻辑组合在一起。
must: 所有的条件,用must组合在一起,表示And的意思
must_not:将must_not中的条件,全部都不能匹配,标识Not的意思
should:所有的条件,用should组合在一起,表示Or的意思
- # 查询省份为武汉或者北京
- # 运营商不是联通
- # smsContent中包含中国和平安
- # bool查询
- POST /sms-logs-index/sms-logs-type/_search
- {
- "query": {
- "bool": {
- "should": [
- {
- "term": {
- "province": {
- "value": "北京"
- }
- }
- },
- {
- "term": {
- "province": {
- "value": "武汉"
- }
- }
- }
- ],
- "must_not": [
- {
- "term": {
- "operatorId": {
- "value": "2"
- }
- }
- }
- ],
- "must": [
- {
- "match": {
- "smsContent": "中国"
- }
- },
- {
- "match": {
- "smsContent": "平安"
- }
- }
- ]
- }
- }
- }
- // Java代码实现Bool查询
- @Test
- public void BoolQuery() throws IOException {
- //1. 创建SearchRequest
- SearchRequest request = new SearchRequest(index);
- request.types(type);
-
- //2. 指定查询条件
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
- // # 查询省份为武汉或者北京
- boolQuery.should(QueryBuilders.termQuery("province","武汉"));
- boolQuery.should(QueryBuilders.termQuery("province","北京"));
- // # 运营商不是联通
- boolQuery.mustNot(QueryBuilders.termQuery("operatorId",2));
- // # smsContent中包含中国和平安
- boolQuery.must(QueryBuilders.matchQuery("smsContent","中国"));
- boolQuery.must(QueryBuilders.matchQuery("smsContent","平安"));
-
- builder.query(boolQuery);
- request.source(builder);
-
- //3. 执行查询
- SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
-
- //4. 输出结果
- for (SearchHit hit : resp.getHits().getHits()) {
- System.out.println(hit.getSourceAsMap());
- }
- }
boosting查询可以帮助我们去影响查询后的score。
positive:只有匹配上positive的查询的内容,才会被放到返回的结果集中。
negative:如果匹配上和positive并且也匹配上了negative,就可以降低这样的文档score。
negative_boost:指定系数,必须小于1.0
关于查询时,分数是如何计算的:
搜索的关键字在文档中出现的频次越高,分数就越高
指定的文档内容越短,分数就越高
我们在搜索时,指定的关键字也会被分词,这个被分词的内容,被分词库匹配的个数越多,分数越高
原本10分,negative了,就成了3分
- # boosting查询 收货安装
- POST /sms-logs-index/sms-logs-type/_search
- {
- "query": {
- "boosting": {
- "positive": {
- "match": {
- "smsContent": "收货安装"
- }
- },
- "negative": {
- "match": {
- "smsContent": "王五"
- }
- },
- "negative_boost": 0.5
- }
- }
- }
- // Java实现Boosting查询
- @Test
- public void BoostingQuery() throws IOException {
- //1. 创建SearchRequest
- SearchRequest request = new SearchRequest(index);
- request.types(type);
-
- //2. 指定查询条件
- SearchSourceBuilder builder = new SearchSourceBuilder();
- BoostingQueryBuilder boostingQuery = QueryBuilders.boostingQuery(
- QueryBuilders.matchQuery("smsContent", "收货安装"),
- QueryBuilders.matchQuery("smsContent", "王五")
- ).negativeBoost(0.5f);
-
- builder.query(boostingQuery);
- request.source(builder);
-
- //3. 执行查询
- SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
-
- //4. 输出结果
- for (SearchHit hit : resp.getHits().getHits()) {
- System.out.println(hit.getSourceAsMap());
- }
- }