kl个人博客 首页>>爬虫,搜索引擎>>java使用jest连接操作Elasticsearch2.2.0中的索引

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

前言

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


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,代码如下:



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插件查看,如下


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


@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项目

<!--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>



kl个人博客