前言
在了解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>