视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Elasticsearch的java api使用
2025-09-30 22:43:06 责编:小OO
文档
Elasticsearch的java api使用

Java  api 访问ElasticSearch的一个演示.网上的例子都是各个之间的,个别地方确实不好整合在一起来理解,希望通过此粗浅的例子能给使用java做搜索引擎的同学一些帮助.

使用环境:

1Jdk1.6 u29

2ElasticSearch(0.20.2)-RTF(感谢medcl的奉献)版本,在谷歌中搜索github中下载.

3Windows 7

4ElasticSearch 访问用jar包.使用maven来添加

      

        org.elasticsearch

        elasticsearch

        0.20.2

    

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的查寻字符串等.下载本文

显示全文
专题