java往elasticsearch(ES)中写入数据

来源:互联网 发布:直接消耗系数矩阵 编辑:程序博客网 时间:2024/06/05 15:25

elasticsearch(ES)好处如下:

Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
使用ES不仅可以方便高效的存储大量数据,更重要的是可以进行全文搜索,这个是mysql等关系数据库所不具备的.

那么怎么使用ES呢,

首先你要了解ES,这个是ES特别好的中文版教程:ES中文版教程

一,ES的基本知识

大家都知道,mysql数据库可以分为:数据库(database) ->表(table) -> 行(row)->列(column),这样就可以唯一的记录一个数据了

同样为了方便查询,ES也分为:索引(index)->类型(type)->文档(document)->字段(field)

具体的对应规则如下:

Relational DB -> Database-> Table -> Row -> ColumnElasticsearch -> Index  -> Type -> Document-> Field

往mysql中写数据之前,需要创建表(table),同样在ES里也需要创建表,不过在ES里叫做创建mapping(映射),关于创建mapping的具体内容大家可以看es的中文文档,

下面给出一个mapping 的例子,大家可以一窥究竟

  "soft_list": {//index的名称    "mappings": {      "soft": {//type的名称        "_ttl": {          "enabled": false        },        "dynamic": "false",        "_all": {          "enabled": false        },        "properties": {          "detailPageUrl": {//具体字段,即field            "analyzer": "ik",            "type": "string"//字段类型          },          "softwareName": {            "analyzer": "ik",//分词类型            "type": "string"          },          "companyName": {            "analyzer": "ik",            "type": "string"          },          "downloadUrl": {            "analyzer": "ik",            "type": "string"          },          "id": {            "type": "integer"          },          "softwareSize": {            "analyzer": "ik",            "type": "string"          },          "payOrFree": {            "analyzer": "ik",            "type": "string"          },          "softwareVer": {            "analyzer": "ik",            "type": "string"          }        }      }    }  }
至此,整个准备工作已经完成,接下来就要用java往ES里写入数据

二,写入数据

1,第一步需要创建和ES中mapping中字段一样的javaBean,这一步和mysql中写入数据一样,

/**  * @author  李光光(编码小王子) * @date    2017年9月1日 下午2:35:07  * @version 1.0    */public class SoftwareInfoEs  {private String companyName;//公司名称private Integer id;//相当于idprivate String softwareName;//软件名private String  downloadUrl;//下载地址private String detailPageUrl;//软件详情页地址private String softwareSize;//软件大小private String softwareVer;//软件大小private String payOrFree;//是否免费private String score;//查询出来的得分//set,get方法}
2,创建写入ES的接口EsJavaClient

public interface EsJavaClient {        <T> void put(T object,Class<T> klass);   }

3,EsJavaClient的实现类如下:

import java.net.InetSocketAddress;import java.util.Map;import java.util.concurrent.ExecutionException;import org.elasticsearch.action.ActionFuture;import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;import org.elasticsearch.action.delete.DeleteRequest;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class EsJavaClientImpl implements EsJavaClient {    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());    private Client client;    private String serverName;//es服务器地址    private int port;//es服务器端口    private String clusterName;//es服务器名称    private volatile Map<String, Pair<String, String>> indexInfos;@Override    public <T> void put(T object,Class<T> klass) {        String index = getIndex(klass);        String type = getType(klass);        try {            ObjectMapper mapper = new ObjectMapper();            String jsonStr = mapper.writeValueAsString(object);            ActionFuture<IndexResponse> future = client.index(new IndexRequest(index, type).source(jsonStr));            IndexResponse response = future.get();//此处会阻塞            logger.info(response.getId());        } catch (InterruptedException e) {            e.printStackTrace();        } catch (ExecutionException e) {            e.printStackTrace();        }catch(Exception e){            e.printStackTrace();        }    }//获取注入的参数    public void setIndexInfos(Map<String, Pair<String, String>> indexInfos) {        this.indexInfos = indexInfos;    }        public Map<String, Pair<String, String>>  getIndexInfos(){        return this.indexInfos;    }    //获取index    private String getIndex(Class klass){        return indexInfos.get(klass.getName()).fst;    }    //获取type    private String getType(Class klass) {        return indexInfos.get(klass.getName()).snd;    }            //set,get方法    public Client getClient() {        return client;    }    public void setClient(Client client) {        this.client = client;    }    public String getServerName() {        return serverName;    }    public void setServerName(String serverName) {        this.serverName = serverName;    }    public int getPort() {        return port;    }    public void setPort(int port) {        this.port = port;    }    public String getClusterName() {        return clusterName;    }    public void setClusterName(String clusterName) {        this.clusterName = clusterName;    }}

3,配置ES的service_bean.xml文件

   <bean id="SoftwareInfoIndexType" class="com.sun.tools.javac.util.Pair">        <constructor-arg><value>你的index</value></constructor-arg>        <constructor-arg><value>你的type</value></constructor-arg>    </bean>            <bean id="esJavaClient" class="com.server.web.service.es.EsJavaClientImpl" init-method="initClient">        <property name="serverName" value="${esclient.serverName}"></property>        <property name="port" value="${esclient.port}"></property>        <property name="clusterName" value="${esclient.clusterName}"></property>        <property name="indexInfos">            <map>                <entry key="com.server.web.domain.SoftwareInfoEs" value-ref="SoftwareInfoIndexType"></entry>            </map>        </property>    </bean>

这样就可以写入到ES了,接下来会陆续更新,怎么从ES查询数据,修改ES中的数据等操作