温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-16 16:52:00 来源:亿速云 阅读:188 作者:iii 栏目:大数据

这篇文章主要讲解了“怎么使用ES客户端来操作搜索引新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用ES客户端来操作搜索引新”吧!

1 导入需要的pom

 <dependencies>
	  <dependency>
	    <groupId>org.elasticsearch</groupId>
	    <artifactId>elasticsearch</artifactId>
	    <version>7.3.0</version>
	 </dependency>
	 <dependency>
	    <groupId>org.elasticsearch.client</groupId>
	    <artifactId>transport</artifactId>
	    <version>7.3.0</version>
	</dependency>
	<dependency>
	    <groupId>org.apache.logging.log4j</groupId>
	    <artifactId>log4j-core</artifactId>
	    <version>2.11.1</version>
	</dependency>
	
	<!-- 把对象转换成json -->
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-databind</artifactId>
	    <version>2.9.9.3</version>
	</dependency>
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-annotations</artifactId>
	    <version>2.9.9</version>
	</dependency>
  </dependencies>

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<SearchHit> iterator = searchHits.iterator();
		while(iterator.hasNext()) {
			SearchHit hit = iterator.next();
			System.out.println(hit.getSourceAsString());
			
			System.out.println("------获取文档属性------");
			Map<String, Object> 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("<em>"); //设置前缀
		highlightBuilder.postTags("</em>");//设置后缀
		
		//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<SearchHit> iterator = searchHits.iterator();
		while(iterator.hasNext()) {
			SearchHit hit = iterator.next();
			System.out.println(hit.getSourceAsString());
			
			System.out.println("------获取文档属性------");
			Map<String, Object> map = hit.getSourceAsMap();
			System.out.println(map.get("content"));
			
			System.out.println("------获取高亮显示的数据------");
			Map<String, HighlightField> 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();
	}

}

感谢各位的阅读,以上就是“怎么使用ES客户端来操作搜索引新”的内容了,经过本文的学习后,相信大家对怎么使用ES客户端来操作搜索引新这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI