zoukankan      html  css  js  c++  java
  • elastic search使用总结

    1. elasticsearch安装

    官方下载地址:https://www.elastic.co/downloads/elasticsearch

    解压文件 elasticsearch-2.4.0.zip

    修改配置文件

    1
    2
    3
    4
    elasticsearch-2.4.0 cat config/elasticsearch.yml |grep -v "#"
    cluster.name: rainbow
    network.host: 127.0.0.1
    http.port: 9200

     配置说明

    cluster.name表示es集群的名称,可以自定义一个自己需要的集群名称
    http.port 表示对外提供http服务时的http端口。
    network.host 表示本地监听绑定的ip地址,此处为测试环境,直接使用本机的ip地址 127.0.0.1.

     启动说明

    1
    elasticsearch-2.4.0 nohup ./bin/elasticsearch &

     启动后显示信息

    es启动监听两个端口,9300和9200
    9300端口是使用tcp客户端连接使用的端口;
    9200端口是通过http协议连接es使用的端口;

    2. 使用http方式增加和查询数据

    增加数据(http PUT):

    1
    2
    3
    ➜ curl -XPUT localhost:9200/user_idx/type_tags/12 -d<br> '{"name" : "Mr.YF", "tags" : ["Go","Java","Lua","C++","Tcl","..."]}'
     
    {"_index":"user_idx","_type":"type_tags","_id":"12","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}

     查询数据(http GET)

    3. 使用elasticsearch客户端编写java代码访问es

    编写es客户端提供者类,对es连接做简单的封装

    SearchClientProvider.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    package org.wyf.elasticsearch.search;
     
    /**
     * Created by wyf on 16/9/25.
     */
    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;
    import org.wyf.common.property.XmlProperties;
     
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
     
    import static java.lang.System.out;
     
    public class SearchClientProvider {
        private static final Logger LOGGER = LoggerFactory.getLogger(SearchClientProvider.class);
     
        private TransportClient client = null;
        private volatile boolean inited = false;
     
        public TransportClient get() {
            return this.client;
        }
     
        @PreDestroy
        public synchronized void close() {
            if (this.client != null) {
                this.client.close();
            }
        }
     
        @PostConstruct
        public synchronized void init() {
            if (!inited) {
                try {
                    Map<String, String> config = XmlProperties.loadFromXml("properties/elasticsearch.xml");
                    if (config == null) {
                        out.println("load xml err");
                        return;
                    }
                    Iterator<Map.Entry<String, String>> iterator = config.entrySet().iterator();
                    Map<String, String> settingConfig = new HashMap<String, String>();
                    while (iterator.hasNext()) {
                        Map.Entry<String, String> next = iterator.next();
                        if (!next.getKey().equals("transport.addresses")) {
                            settingConfig.put(next.getKey(), next.getValue());
                        }
                    }
                    Settings settings = Settings.builder().put(settingConfig).build();
                    TransportClient client = TransportClient.builder().settings(settings).build();
                    this.client = client;
     
                    String[] addresses = config.get("transport.addresses").split(",");
                    for (String address : addresses) {
                        String[] hostAndPort = address.split(":");
                        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostAndPort[0]), Integer.valueOf(hostAndPort[1])));
     
                    }
                    this.inited = true;
                } catch (UnknownHostException e) {
                    LOGGER.error(String.format("init search client err:=>msg:[%s]", e.getMessage()), e);
                    if (client != null) {
                        this.client.close();
                    }
                }
            }
        }
    }

     编写elasticsearch的配置文件加载类

     XmlProperties.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package org.wyf.common.property;
     
    import org.slf4j.LoggerFactory;
    import org.slf4j.Logger;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
     
    public class XmlProperties {
        private static final Logger LOGGER = LoggerFactory.getLogger(XmlProperties.class);
     
        private XmlProperties() {
        }
     
        public static Map<String, String> loadFromXml(String xmlPropertiesPath) {
            try {
                Object in = XmlProperties.class.getClassLoader().getResourceAsStream(xmlPropertiesPath);
                if(in != null) {
                    LOGGER.info("Found the xml properties [{}] in class path,use it", xmlPropertiesPath);
                    Map e1 = loadFromXml((InputStream)in);
                    return e1;
                }
                Map<String, String> resMap = null;
     
                File e = new File(xmlPropertiesPath);
                if(!e.isFile()) {
                    return resMap;
                }
     
                LOGGER.info("Found the xml properties [{}] in file path,use it", xmlPropertiesPath);
                in = new FileInputStream(new File(xmlPropertiesPath));
                resMap = loadFromXml((InputStream)in);
                ((InputStream) in).close();
                return resMap;
            } catch (Exception var7) {
                LOGGER.error("Load xml properties [" + xmlPropertiesPath + "] error.", var7);
            }
            return null;
        }
     
        public static Map<String, String> loadFromXml(InputStream in) throws IOException {
            Properties properties = new Properties();
            properties.loadFromXML(in);
            HashMap map = new HashMap();
            Set entries = properties.entrySet();
            Iterator iter = entries.iterator();
     
            while(iter.hasNext()) {
                Map.Entry entry = (Map.Entry)iter.next();
                map.put((String)entry.getKey(), (String)entry.getValue());
            }
     
            return map;
        }
    }

     编写elasticsearch简单的操作类,包含成员函数 save update get 和delete

    SearchImpl.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    package org.wyf.elasticsearch;
     
    /**
     * Created by wyf on 16/9/25.
     */
    import org.elasticsearch.action.delete.DeleteRequestBuilder;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequestBuilder;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequestBuilder;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.index.engine.VersionConflictEngineException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.wyf.elasticsearch.search.SearchClientProvider;
     
    import javax.annotation.PostConstruct;
    import java.util.Map;
     
    public class SearchImpl implements ISearch {
     
        private static final Logger LOGGER = LoggerFactory.getLogger(SearchImpl.class);
     
        private SearchClientProvider searchClientProvider;
        public  SearchImpl() {
            searchClientProvider = new SearchClientProvider();
            searchClientProvider.init();
        }
     
        public Map<String, Object> save(String index, String type, String id, Map<String, Object> data) {
            TransportClient client = searchClientProvider.get();
            IndexRequestBuilder builder = client.prepareIndex(index, type, id);
            IndexResponse response = builder
                    .setSource(data)
                    .execute()
                    .actionGet();
            LOGGER.info("save index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}", index, type, id, data, response);
            return data;
        }
     
        public int update(String index, String type, String id, Map<String, Object> data) {
            int i = 2;
            do {
                try {
                    if (_innerUpdate(index, type, id, data)) return 1;
                } catch (VersionConflictEngineException e) {
                    LOGGER.warn(String.format("update index:=>index:%s, type:%s, id:%s, data:%s, rsp:%s",
                            index, type, id, data, e.getMessage()), e);
                }
            } while ((i--) > 0);
            return _innerUpdate(index, type, id, data) ? 1 : 0;
        }
     
        public int delete(String index, String type, String id) {
            TransportClient client = searchClientProvider.get();
            DeleteRequestBuilder builder = client.prepareDelete(index, type, id);
            DeleteResponse response = builder.execute().actionGet();
            LOGGER.info("delete index:=>index:{}, type:{}, id:{}, rsp:{}",
                    index, type, id, response);
            return response.isFound() ? 1 : 0;
        }
     
        public Map<String, Object> get(String index, String type, String id) {
            TransportClient client = searchClientProvider.get();
            GetRequestBuilder builder = client.prepareGet(index, type, id);
            GetResponse response = builder.execute().actionGet();
            return response.isExists() ? response.getSource() : null;
        }
     
        private boolean _innerUpdate(String index, String type, String id, Map<String, Object> data) {
            TransportClient client = searchClientProvider.get();
            GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);
            GetResponse getResponse = getRequestBuilder.execute().actionGet();
            if (getResponse.isExists()) {
                final long version = getResponse.getVersion();
                final Map<String, Object> source = getResponse.getSource();
                source.putAll(data);
     
                IndexRequestBuilder builder = client.prepareIndex(index, type, id);
                IndexResponse response = builder
                        .setVersion(version)
                        .setSource(source)
                        .execute()
                        .actionGet();
                LOGGER.info("update index:=>index:{}, type:{}, id:{}, data:{}, rsp:{}",
                        index, type, id, data, response);
                return true;
            }
            throw new RuntimeException(String.format("can not get document:=>index:%s, type:%s, id:%s ", index, type, id));
        }
    }

    编写单元测试类

    ElasticSearchTest.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package org.wyf;
     
    import org.junit.Before;
    import org.junit.Test;
    import org.wyf.elasticsearch.ISearch;
    import org.wyf.elasticsearch.SearchImpl;
     
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
     
    /**
     * Created by wyf on 16/9/25.
     */
    public class ElasticsearchTest {
        ISearch search;
     
        @Test
        public void get() {
            Map<String,Object> map = search.get("a", "type1", "123");
            Set<String> set = map.keySet();
            for (Iterator<String> it = set.iterator(); it.hasNext();) {
                String key = it.next();
                System.out.println(key + ":" + map.get(key));
            }
        }
     
        @Test
        public void save() {
            Map<String, Object> values = new HashMap<String, Object>();
            values.put("k1", "v1");
            values.put("k2", "v2");
     
            Map<String,Object> map = search.save("a", "type1", "123", values);
            Set<String> set = map.keySet();
            for (Iterator<String> it = set.iterator(); it.hasNext();) {
                String key = it.next();
                System.out.println(key + ":" + map.get(key));
            }
     
        }
     
        @Before
        public void before() {
            search = new SearchImpl();
        }
    }

    elasticsearch的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
        <comment>elasticsearch的配置</comment>
        <entry key="client.transport.sniff">true</entry>
        <entry key="cluster.name">rainbow</entry>
        <entry key="transport.addresses">127.0.0.1:9300</entry>
    </properties>

    测试结果:

    测试save函数结果

    http接口查询结果页面

    遇到的问题

    最开始调试时返回如下错误

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9200}]
    ]
        at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:290)
        at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:207)
        at org.elasticsearch.client.transport.support.TransportProxyClient.execute(TransportProxyClient.java:55)
        at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:283)
        at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:347)
        at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:85)
        at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:59)
        at org.wyf.elasticsearch.SearchImpl.save(SearchImpl.java:36)
        at org.wyf.ElasticsearchTest.save(ElasticsearchTest.java:35)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:253)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

    解决办法是检查es集群的名称和端口是否正确

    由于端口配置错误,导致如上问题

    正确的端口是9300,正如最开始说的那样,使用tcp方式访问es时,使用端口9300,使用http方式访问es使用端口9200.

    代码git地址:

    https://github.com/gityf/java_demo/tree/master/demo/src/main/java/org/wyf/elasticsearch

    Done.

  • 相关阅读:
    基于HTML5的多张图片上传
    如何限制textarea文本框的输入字数
    页面第一次加载实现图片淡入方式加载
    ajax实现的无刷新分页代码实例
    26个Jquery使用小技巧
    Windows下搭建PHP开发环境
    Jquery插件之ajaxForm ajaxSubmit的理解用法
    Java XML解析器
    JS截取字符串
    在Eclipse中配置tomcat
  • 原文地址:https://www.cnblogs.com/jpfss/p/10757264.html
Copyright © 2011-2022 走看看