java使用jest连接操作Elasticsearch2.2.0中的索引

2023-11-18 09:14:43 浏览数 (2)

前言

在了解jest框架前,楼主一直尝试用官方的Elasticsearch java api连接es服务的,可是,不知何故,一直报如下的异常信息,谷歌了很久,都说是jvm版本不一致导致的问题,可我是本地测试的,jvm肯定是一致的,这个问题现在都木有解决,but,这怎么能阻止我探索es的脚步呢,so,让我发现了jest 这个框架

代码语言:javascript复制
org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream
Caused by: org.elasticsearch.transport.TransportSerializationException: Failed to deserialize exception response from stream

我的测试代码是参考官方api实例的,官方api地址:Elasticsearch java api,代码如下:

代码语言:javascript复制
Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
		QueryBuilder queryBuilder =  QueryBuilders.termQuery("content", "搜");
		SearchResponse searchResponse = client.prepareSearch("indexdata").setTypes("fulltext")
				.setQuery(queryBuilder)
				.execute()
				.actionGet();
		SearchHits hits = searchResponse.getHits();
		System.out.println("查询到记录数:"   hits.getTotalHits());
		SearchHit[] searchHists = hits.getHits();
		for(SearchHit sh : searchHists){
			System.out.println("content:" sh.getSource().get("content"));
		}
		client.close();

如果有人知道怎么回事,告诉一下楼主吧,让楼主坑的明白,感激不尽了,我的es版本是2.2.0

进入正题

了解jest

jest是一个基于 HTTP Rest 的连接es服务的api工具集,功能强大,能够使用es java api的查询语句,项目是开源的,github地址:https://github.com/searchbox-io/Jest

我的测试用例

分词器:ik,分词器地址:https://github.com/medcl/elasticsearch-analysis-ik ,es的很多功能都是基于插件提供的,es版本升级都2.2.0后,安装插件的方式不一样了,如果你安装ik分词插件有问题,请点击右上角的qq联系博主

新建索引

curl -XPUT http://localhost:9200/indexdata

创建索引的mapping,指定分词器

curl -XPOST http://localhost:9200/indexdata/fulltext/_mapping

{   "fulltext": {     "_all": {       "analyzer": "ik_max_word",       "search_analyzer": "ik_max_word",       "term_vector": "no",       "store": "false"     },     "properties": {       "content": {         "type": "string",         "store": "no",         "term_vector": "with_positions_offsets",         "analyzer": "ik_max_word",         "search_analyzer": "ik_max_word",         "include_in_all": "true",         "boost": 8       },       "description": {         "type": "string",         "store": "no",         "term_vector": "with_positions_offsets",         "analyzer": "ik_max_word",         "search_analyzer": "ik_max_word",         "include_in_all": "true",         "boost": 8       },       "title": {         "type": "string",         "store": "no",         "term_vector": "with_positions_offsets",         "analyzer": "ik_max_word",         "search_analyzer": "ik_max_word",         "include_in_all": "true",         "boost": 8       },       "keyword": {         "type": "string",         "store": "no",         "term_vector": "with_positions_offsets",         "analyzer": "ik_max_word",         "search_analyzer": "ik_max_word",         "include_in_all": "true",         "boost": 8       }     }   } }

mapping信息可以用head插件查看,如下

导入数据和查询,看代码吧

代码语言:javascript复制
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ElasticSearchTestApplication.class)
public class JestTestApplicationTests {
	@Autowired
	private KlarticleDao klarticleDao;
	//得到JestClient实例
    public JestClient getClient()throws Exception{
		JestClientFactory factory = new JestClientFactory();
		factory.setHttpClientConfig(new HttpClientConfig
				.Builder("http://127.0.0.1:9200")
				.multiThreaded(true)
				.build());

		return  factory.getObject();
	}
	/**
	 * 导入数据库数据到es
	 * @throws Exception
     */
	@Test
	public void contextLoads() throws  Exception{
		JestClient client=getClient();
		Listlists=klarticleDao.findAll();
		for(Klarticle k:lists){
			Index index = new Index.Builder(k).index("indexdata").type("fulltext").id(k.getArcid() "").build();
			System.out.println("添加索引----》" k.getTitle());
			client.execute(index);
		}
		//批量新增的方式,效率更高
		Bulk.Builder bulkBuilder = new Bulk.Builder();
		for(Klarticle k:lists){
			Index index = new Index.Builder(k).index("indexdata").type("fulltext").id(k.getArcid() "").build();
			bulkBuilder.addAction(index);
		}
		client.execute(bulkBuilder.build());
		client.shutdownClient();
	}
	//搜索测试
	@Test
	public void JestSearchTest()throws Exception{
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.query(QueryBuilders.matchQuery("content", "搜索"));
		Search search = new Search.Builder(searchSourceBuilder.toString())
				// multiple index or types can be added.
				.addIndex("indexdata")
				.build();
		JestClient client =getClient();
		SearchResult result=  client.execute(search);
//          List> hits = result.getHits(Klarticle.class);
		Listarticles = result.getSourceAsObjectList(Klarticle.class);
		for(Klarticle k:articles){
			System.out.println("------->:" k.getTitle());
		}
	}
}

下面是依赖的jar,maven项目

代码语言:javascript复制
<!--jest依赖-->
		<dependency>
			<groupId>io.searchbox</groupId>
			<artifactId>jest</artifactId>
			<version>2.0.0</version>
		</dependency>
		<!--jest 日志依赖-->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>2.2.0</version>
		</dependency>
	</dependencies>

0 人点赞