es多条件查询之must用法(Java实现)

package com.zx.znyd.es;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.mustache.Mustache;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.MatchQueryBuilder.Operator;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.fastjson.JSONObject;
import com.zx.znyd.common.MD5;
import com.zx.znyd.common.SpringContextUtil;
import com.zx.znyd.dao.AutoReplyDao;
import com.zx.znyd.data.model.AutoReply;
import com.zx.znyd.data.model.LogIndex;
import com.zx.znyd.service.AutoReplyDeployService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestES {

	@Autowired
	@Qualifier("esClient")
	private Client client;
    
    @Test  
    public void testSearch()  
    {  
    	String index="index_log_daily";
    	String type="uq_log";
    	String uquestion = "139";
    	String province = "江苏";
        SearchResponse searchResponse = client.prepareSearch(index)  
                .setTypes(type)  
                .setQuery(QueryBuilders.matchAllQuery()) //查询所有
                .setQuery(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("uquestion", uquestion))//查询uquestion为139的
                .must(QueryBuilders.matchQuery("province", province)))//查询省份为江苏的
                //.setQuery(QueryBuilders.matchQuery("uquestion", "12599").operator(Operator.AND)) //根据tom分词查询name,默认or 
                //.setQuery(QueryBuilders.matchQuery("province", "江苏").operator(Operator.AND)) //根据tom分词查询name,默认or 
                //.setQuery(QueryBuilders.multiMatchQuery("tom", "name", "age")) //指定查询的字段  
                //.setQuery(QueryBuilders.queryString("name:to* AND age:[0 TO 19]")) //根据条件查询,支持通配符大于等于0小于等于19  
                //.setQuery(QueryBuilders.termQuery("name", "tom"))//查询时不分词  
                .setSearchType(SearchType.QUERY_THEN_FETCH)  
                .setFrom(0).setSize(10)//分页  
                //.addSort("age", SortOrder.DESC)//排序  
                .get();  
          
        SearchHits hits = searchResponse.getHits();  
        long total = hits.getTotalHits();  
        System.out.println(total);  
        SearchHit[] searchHits = hits.hits();  
        for(SearchHit s : searchHits)  
        {  
            System.out.println(s.getSourceAsString());
            String []logindex=s.getSourceAsString().split(",");
            
        }  
    }  
}

  

转载于:https://www.cnblogs.com/lchzlp/p/6808226.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Elasticsearch 提供的 Update By Query API 来实现多条件查询并更新多个字段的操作。以下是一个 Java 实现的示例代码: ```java import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.reindex.UpdateByQueryRequest; import org.elasticsearch.index.reindex.UpdateByQueryResponse; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import java.io.IOException; import java.util.Map; public class MultiFieldUpdateUtil { public static BulkResponse multiFieldUpdate(RestHighLevelClient client, String index, Map<String, Object> queryMap, Map<String, Object> updateMap) throws IOException { BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); for (Map.Entry<String, Object> entry : queryMap.entrySet()) { boolQuery.must(QueryBuilders.termQuery(entry.getKey(), entry.getValue())); } Script script = new Script(ScriptType.INLINE, "painless", generateScript(updateMap), null); UpdateByQueryRequest request = new UpdateByQueryRequest(index); request.setQuery(boolQuery); request.setScript(script); UpdateByQueryResponse updateByQueryResponse = client.updateByQuery(request, RequestOptions.DEFAULT); return updateByQueryResponse.getBulkResponse(); } private static String generateScript(Map<String, Object> updateMap) { StringBuilder scriptBuilder = new StringBuilder(); scriptBuilder.append("ctx._source.putAll(["); for (Map.Entry<String, Object> entry : updateMap.entrySet()) { scriptBuilder.append("\"").append(entry.getKey()).append("\": "); Object value = entry.getValue(); if (value instanceof String) { scriptBuilder.append("\"").append(value).append("\", "); } else { scriptBuilder.append(value).append(", "); } } scriptBuilder.append("])"); return scriptBuilder.toString(); } } ``` 该工具类中的 multiFieldUpdate 方法接收三个参数,分别是 Elasticsearch 客户端实例、索引名、查询条件和更新内容。其中,查询条件和更新内容都是以 Map 的形式传入的,可以自由指定多个字段和对应的值。方法中使用了 Elasticsearch 提供的 Update By Query API 来实现多条件查询并更新多个字段的操作。 需要注意的是,由于 Elasticsearch 的版本差异较大,具体的 API 调用方式可能会有所不同,上述代码适用于 Elasticsearch 7.x 版本。同时,该工具类没有进行任何异常处理,需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值