Java api 访问ElasticSearch的一个演示.网上的例子都是各个之间的,个别地方确实不好整合在一起来理解,希望通过此粗浅的例子能给使用java做搜索引擎的同学一些帮助.
使用环境:
1Jdk1.6 u29
2ElasticSearch(0.20.2)-RTF(感谢medcl的奉献)版本,在谷歌中搜索github中下载.
3Windows 7
4ElasticSearch 访问用jar包.使用maven来添加
ES的环境搭建:
1 解压ElasticSearch(0.20.2)-RTF到某个目录,
在本例中ESrtf解压到了两台电脑上(ip:192.168.1.232,ip:192.168.1.65)
2在本例中因为使用的是rtf的版本,所以只需修改Eshome config目录下的elasticsearch.yml文件,在#cluster.name: elasticsearch这行下增加cluster.name: wallyCluster这行,作用为将es集群的默认名elasticsearch改为wallyCluster(自定义的集群名称).在#network.host: 127.0.0.1这行下增加network.host: 192.168.1.232(本例中es解压到了2台电脑中,所以另一台的应该为192.168.1.65),作用为绑定es启动时对外服务的ip,因为我所用的机子有多个网卡,所以指定了,如果是单网卡,可以不用这句设置.
3在eshome下的bin目录中直接运行elasticsearch.bat(前提为必须设置好java的home环境变量)启动es
使用rtf版本进行开发,es基本不需要修改什么.至于es中使用到的内存大小设置,中文分词,cluster等等ES概念请百度.
Java api的使用:
网上看了各种例子,很大程度属于转载,讲到java api的使用,都是简单的某个方面的使用,看es官网介绍加自己的理解摸索,下面给出个完整使用javaapi的demo.
import java.io.IOException;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import com.wally.crj.util.TimeHelper;
public class ESMappingBiz {
private Client client;
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
/**
* 预定义一个索引的mapping,使用mapping的好处是可以个性的设置某个字段等的属性
* @throws Exception
*/
public void buildIndexSysDm() throws Exception{
//在本例中主要得注意,ttl及timestamp如何用java ,这些字段的具体含义,请去到es官网查看
CreateIndexRequestBuilder cib=client.admin().indices().prepareCreate("productindex");
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("we3r")//
.startObject("_ttl")//有了这个设置,就等于在这个给索引的记录增加了失效时间,
//ttl的使用地方如在分布式下,web系统用户登录状态的维护.
.field("enabled",true)//默认的false的
.field("default","5m")//默认的失效时间,d/h/m/s 即天/小时/分钟/秒
.field("store","yes")
.field("index","not_analyzed")
.endObject()
.startObject("_timestamp")//这个字段为时间戳字段.即你添加一条索引记录后,自动给该记录增加个时间字段(记录的创建时间),搜索中可以直接搜索该字段.
.field("enabled",true)
.field("store","no")
.field("index","not_analyzed")
.endObject()
.startObject("properties")//properties下定义的title等等就是属于我们需要的自定义字段了,相当于数据库中的表字段 ,此处相当于创建数据库表
.startObject("title").field("type", "string").field("store", "yes").endObject()
.startObject("description").field("type", "string").field("index", "not_analyzed").endObject()
.startObject("price").field("type", "double").endObject()
.startObject("onSale").field("type", "boolean").endObject()
.startObject("type").field("type", "integer").endObject()
.startObject("createDate").field("type", "date").field("format","YYYYMMddhhMMSS").endObject()
.endObject()
.endObject()
.endObject();
cib.addMapping("prindextype", mapping);
cib.execute().actionGet();
}
/**
* 该方法为增加索引记录
* @throws Exception
*/
public void buildIndexSysDm22() throws Exception{
// productindex为上个方法中定义的索引,prindextype为类型.jk8231为id,以此可以代替memchche来进行数据的缓存
IndexResponse response = client.prepareIndex("productindex", "prindextype" ,"jk8231")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("title", "abcd1")//该字段在上面的方法中mapping定义了,所以该字段就有了自定义的属性,比如 type等
.field("description", "中国人3")
.field("price", 232 )
.field("onSale",true)
.field("type",2)
.field("createDate",TimeHelper.getCurrentTime())
.field("dfsfs","哈哈")//该字段在上面方法中的mapping中没有定义,所以该字段的属性使用es默认的.
.endObject()
)
.setTTL(8000)//这样就等于单独设定了该条记录的失效时间,单位是毫秒,必须在mapping中打开_ttl的设置开关
.execute()
.actionGet();
IndexResponse response2 = client.prepareIndex("productindex", "prindextype" ,"jk8234")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("title", "abcd2")
.field("description", "中国人2")
.field("price", 232 )
.field("onSale",true)
.field("type",22)
.field("createDate",TimeHelper.getCurrentTime())
.endObject()
)
.execute()
.actionGet();
}
/**
* 得到访问es的客户端,我们使用Transport Client
* @return
*/
public Client buildClient(){
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true).put("cluster.name", "wallyCluster").build();
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("192.168.1.232", 9300))
.addTransportAddress(new InetSocketTransportAddress("192.168.1.65", 9300));
return client;
}
/**
* 搜索的使用
*/
public void exm(){
System.out.println("删除");
DeleteResponse responsedd = client.prepareDelete("productindex", "prindextype", "34dds1")
.setOperationThreaded(false)
.execute()
.actionGet();
System.out.println("根据主键搜索得到值");
GetResponse responsere = client.prepareGet("productindex", "prindextype", "oht-Sp87SA6J5l3yo9dagw")
.execute()
.actionGet();
System.out.println("完成读取--"+responsere.getSourceAsString());
System.out.println("搜索");
SearchRequestBuilder builder= client.prepareSearch("productindex") //搜索productindex,prepareSearch(String... indices)注意该方法的参数,可以搜索多个索引
.setTypes("prindextype")
.setSearchType(SearchType.DEFAULT)
.setFrom(0)
.setSize(50);
QueryBuilder qb2 = QueryBuilders.boolQuery() // boolQuery() 就相当于 sql中的and
.must(new QueryStringQueryBuilder("万d 里").field("description"))//QueryStringQueryBuilder是单个字段的搜索条件,相当于组织sql的 where后面的 字段名=字段值
.should(new QueryStringQueryBuilder("3").field("dfsfs"))
.must(QueryBuilders .termQuery("dfsfs", "里"));//关于QueryStringQueryBuilder及termQuery等的使用可以使用es插件head来进行操作体会个中query的不同
builder.setQuery(qb2);
SearchResponse responsesearch = builder.execute().actionGet();
System.out.println(""+responsesearch);
try{String jsondata= responsesearch.getHits().getHits()[0].getSourceAsString();
System.out.println("搜索出来的数据jsondata-- "+jsondata);
}catch(Exception es){
}
}
public static void main(String[] dfd){
ESMappingBiz esm=new ESMappingBiz();
esm.setClient(esm.buildClient());
try {
// esm.buildIndexSysDm();
esm.buildIndexSysDm22();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
esm.getClient().close();
}
}
}
在开发中,建议使用es的一些插件来查看es集群的即时信息.比如head.可以很直观的查看索引的信息,及组织json的查寻字符串等.下载本文