Java中使用elasticsearch搜索引擎实现简单、修改…

2018-11-09 02:38:11来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

以下的操作环境为:jdk:1.8;elasticsearch:5.2.0

maven架包下载坐标为:

<dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport-netty4-client</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>org.nlpcn</groupId>
    <artifactId>elasticsearch-sql</artifactId>
    <version>6.3.0.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.2.0</version>
</dependency>

Java创建ES连接工具类:

 

//创建连接工具类
public class ESClientConnectionUtil {
    public static TransportClient client=null;
    public final static String HOST = "192.168.200.211"; //服务器部署
    public final static Integer PORT = 9301; //端口
public static TransportClient  getESClientConnection(){
    if (client == null) {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
            try {
                //设置集群名称
                Settings settings = Settings.builder().put("cluster.name", "es5").put("client.transport.sniff", true).build();
                //创建client
                client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
            } catch (Exception ex) {
                ex.printStackTrace();
                System.out.println(ex.getMessage());
        }
    }
    return client;
}

}

 

用Java命令想elasticsearch中插入数据

 

public Map<String,Object> addTopic(KnowledgeTopicDTO knowledgeTopicDTO){
    Map<String,Object> map = new HashMap<>();
 //连接ES
    TransportClient transportClient =  ESClientConnectionUtil.getESClientConnection();
    JSONObject json = JSONObject.fromObject(knowledgeTopicDTO);//后台传过来的对象数据转换成json格式
    try{
        //index 索引名称(相当于数据库) type :类型(相当于数据库中的表)
        IndexResponse response = transportClient.prepareIndex("knowledge", "knowledge_theme").setSource(json, XContentType.JSON).get();
        if(null !=response.getId()){
            map.put("code",200);
            return map;
        }
    }catch (Exception e){
        e.printStackTrace();
        map.put("code",500);
        return map;
    }
    return null;
}

 

使用Java根据id查询数据

 

//连接ES
    TransportClient transportClient =  ESClientConnectionUtil.getESClientConnection();
//参数:索引名,类型(type) id
GetResponse response = client.prepareGet("knowledge", "knowledge_theme", "1")
        .setOperationThreaded(false)    // 线程安全
        .get();

 

根据id进行修改数据

 

//knowledgeTopic为修改数据的对象
//修改状态后的对象转换成json数据
JSONObject fromObject= JSONObject.fromObject(knowledgeTopic);
//参数:索引名,类型(type) id 要修改的json数据:fromObject
UpdateResponse updateResponse = client.prepareUpdate("knowledge", "knowledge_theme", "1")
        .setDoc(fromObject).get();

 

ES模糊查询

 

SearchResponse searchResponse=null;
//连接elasticsearch
TransportClient transportClient =  ESClientConnectionUtil.getESClientConnection();
searchResponse = client.prepareSearch()
                    .setIndices("knowledge")
                    .setTypes("knowledge_theme")
                     .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                    .setScroll(TimeValue.timeValueMinutes(30)) //游标维持时间
                    .setSize(2 * 5)//实际返回的数量为10*index的主分片数
                     .setQuery(QueryBuilders.wildcardQuery("name", ("*"+name+"*").toLowerCase()))  //查询的字段名及值
                    .execute()
                    .actionGet();

 

以上功能本人已亲测过,都能实现,希望这对大家有所帮助

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Tomcat7启动报Error starting static Resources错误

下一篇:ArrayList和LinkedList、Vector的优缺点?