ES - 使用ES客户端来操作搜索引新

1 导入需要的pom

 
	  
	    org.elasticsearch
	    elasticsearch
	    7.3.0
	 
	 
	    org.elasticsearch.client
	    transport
	    7.3.0
	
	
	    org.apache.logging.log4j
	    log4j-core
	    2.11.1
	
	
	
	
	    com.fasterxml.jackson.core
	    jackson-databind
	    2.9.9.3
	
	
	    com.fasterxml.jackson.core
	    jackson-annotations
	    2.9.9
	
  

2 编写方法

package com.shi.es;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * ES客户端类
 * 
 * @author shiye
 *
 */
public class ElasticSearchClient {

	/**
	 *  创建索引
	 * @throws Exception
	 */
	public void createIndex() throws Exception {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

		// 3 使用client创建一个索引库
		client.admin().indices().prepareCreate("index_client").get();// 执行操作
		System.out.println("index_client 索引设置成功...");
		// 4 关闭client对象
		client.close();
	}

	/**
	 *  设置mapping信息
	 * @throws IOException
	 */
	public void setMappings() throws IOException {

		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

//		{
//	        "properties": {
//	            "content": {
//	                "type": "text",
//	                "analyzer": "ik_max_word",
//	                "search_analyzer": "ik_max_word"
//	            }
//	        }
//		}
		XContentBuilder builder = XContentFactory.jsonBuilder()
				.startObject()
					.startObject("properties")
						.startObject("content")
							.field("type", "text")
							.field("analyzer","ik_max_word")
							.field("search_analyzer","ik_max_word")
						.endObject()
					.endObject()
				.endObject();
		System.out.println(builder.toString());
		//使用client把mapping信息设置到索引库中
		client.admin().indices()
				.preparePutMapping("index_client") //设置要做映射的索引
				.setType("content")//设置要做映射的type
				.setSource(builder)//mapping信息
				.get();//执行操作
		System.out.println("mapping设置成功...");
		//管理客户端
		client.close();

	}
	
	/**
	 * 添加文档 方式一
	 * @throws IOException 
	 */
	public void setAddDOC1() throws IOException {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
		
		XContentBuilder builder = XContentFactory.jsonBuilder()
				.startObject()
					.field("content","美国留给伊拉克的是个烂摊子吗")
				.endObject();
		System.out.println(builder.isPrettyPrint());
		//把文档对象添加到索引库
		client.prepareIndex()
				.setIndex("index_client") //设置索引名称
				.setType("content")	//设置type
				.setId("1")	//设置文档的id,如果不设置的话自动生成一个id
				.setSource(builder) //设置文档信息
				.get(); //执行操作
		System.out.println("文档添加成功...");
		//关闭客户端
		client.close();
	}
	
	/**
	 * 添加文档 方式二
	 * @throws IOException 
	 */
	public void setAddDOC2() throws IOException {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
		
		//创建对象
		Content content = new Content();
		content.setContent("公安部:各地校车将享最高路权");
		
		ObjectMapper objectMapper = new ObjectMapper();
		String jsonDocument = objectMapper.writeValueAsString(content);
		System.out.println(jsonDocument);
		
		//使用client对象把文档写入索引库
		client.prepareIndex("index_client", "content")
				.setSource(jsonDocument,XContentType.JSON)
				.get();
		
		System.out.println("文档添加成功...");
		//关闭客户端
		client.close();
	}

}

 

package com.shi.es;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

public class ESQueryClient {
	
	/**
	 * 简单的执行查询对象
	 * @param client
	 * @param builder
	 */
	private void search(TransportClient client , QueryBuilder builder) {
		//4  执行查询
		SearchResponse searchResponse = client.prepareSearch("index_client")
				.setTypes("content")
				.setQuery(builder)
				.setFrom(0) //起始行数
				.setSize(5)	//每一页显示的数量
				.get();
		
		//5 取查询结果
		SearchHits searchHits = searchResponse.getHits();
	
		System.out.println("查询到的总的结果数 = " + searchHits.getTotalHits());
	
		Iterator iterator = searchHits.iterator();
		while(iterator.hasNext()) {
			SearchHit hit = iterator.next();
			System.out.println(hit.getSourceAsString());
			
			System.out.println("------获取文档属性------");
			Map map = hit.getSourceAsMap();
			System.out.println(map.get("content"));
		}
	}
	
	/**
	 * 设置高亮显示的查询
	 * @param client
	 * @param builder
	 * @param hightFiled
	 */
	private void search(TransportClient client , QueryBuilder builder, String hightFiled) {
		
		HighlightBuilder highlightBuilder = new HighlightBuilder();
		highlightBuilder.field(hightFiled); //设置需要高亮显示的域
		highlightBuilder.preTags(""); //设置前缀
		highlightBuilder.postTags("");//设置后缀
		
		//4  执行查询
		SearchResponse searchResponse = client.prepareSearch("index_client")
				.setTypes("content")
				.setQuery(builder)
				.setFrom(0) //起始行数
				.setSize(5)	//每一页显示的数量
				.highlighter(highlightBuilder)//设置高亮显示
				.get();
		
		//5 取查询结果
		SearchHits searchHits = searchResponse.getHits();
	
		System.out.println("查询到的总的结果数 = " + searchHits.getTotalHits());
	
		Iterator iterator = searchHits.iterator();
		while(iterator.hasNext()) {
			SearchHit hit = iterator.next();
			System.out.println(hit.getSourceAsString());
			
			System.out.println("------获取文档属性------");
			Map map = hit.getSourceAsMap();
			System.out.println(map.get("content"));
			
			System.out.println("------获取高亮显示的数据------");
			Map highlightFields = hit.getHighlightFields();
			HighlightField field = highlightFields.get(hightFiled);
			Text[] fragments = field.getFragments();
			if(fragments != null) {
				System.out.println(fragments[0]);
			}
		}
	}

	/**
	 * 通过id来查询
	 * @throws UnknownHostException
	 */
	public void queryById() throws UnknownHostException {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

		//3 创建一个查询对象
		QueryBuilder builder = QueryBuilders.idsQuery().addIds("1","2","3");
		
		search(client,builder);//执行查询
	}
	
	/**
	 * 通过Term来查询
	 * @throws UnknownHostException
	 */
	public void queryByTerm() throws UnknownHostException {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

		//3 创建一个查询对象
		QueryBuilder builder = QueryBuilders.spanTermQuery("content", "伊拉克");
		
//		search(client,builder);//执行查询
		search(client,builder,"content");//执行高亮查询
	}
	
	/**
	 * 通过StringQuery来查询
	 * 先对需要查询的字符串进行分词,在查询
	 * @throws UnknownHostException
	 */
	public void queryByQueryString() throws UnknownHostException {
		// 1 创建一个Settings对象,相当于一个配置信息,主要配置集群中的名称
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
		// 2 创建一个客户端client对象 (单机版的暂时没问题,集群的有问题)
		TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
		client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

		//3 创建一个查询对象
		QueryBuilder builder = QueryBuilders.queryStringQuery("无人驾驶校车").defaultField("content");
		
		search(client,builder);//执行查询
	}
}

3 测试

package com.shi.es;

public class ClientTest {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

		//创建
//		ElasticSearchClient esClient = new ElasticSearchClient();
//		esClient.createIndex(); //创建索引库
//		esClient.setMappings();//设置mapping信息
//		esClient.setAddDOC1();//添加文档 方式1
//		esClient.setAddDOC2();//添加文档 方式2
		
		//查询
		ESQueryClient client = new ESQueryClient();
//		client.queryById();
		client.queryByTerm();
//		client.queryByQueryString();
	}

}

 

转载于:https://my.oschina.net/u/3677987/blog/3096763

你可能感兴趣的:(大数据,json,java)