分布式搜索Elasticsearch——项目过程(一)

      本文描述的是内嵌ES项目的开发,虽嵌入了Paoding分词器,但代码过程中暂未使用,故遇到针对paoding的步骤,可直接跳过。

        技术描述:ElasticSearch0.20.6+Paoding。

        技术环境:Eclipse、Maven

        步骤一:下载并安排ElasticSearch,编写本文章时使用的是0.20.6版本,下载地址为:http://www.elasticsearch.org/downloads/0-20-6/,下载完成后,将之解压到任一目录,前期的JDK环境准备不予赘述。

        步骤二:在Eclipse下建立一个Maven项目(Eclipse安装Maven插件过程不予赘述,你可直接使用Eclipse的Marketplace安装),模板使用maven-archetype-quickstart即可,创建过程不予赘述,详情询问度娘,此入假设建立的项目名为esample

        步骤三:至https://github.com/medcl/elasticsearch-analysis-paoding下载ES的paoding插件代码,下载完成后,将之导入Eclipse,elasticsearch-analysis-paoding是个maven项目,导入时请注意,此入假设导入后项目名为elasticsearch-analysis-paoding-master。

        步骤四:在esample项目中,分别引入junit、es、es-paoding和jackon,引入的配置如下所示:

[java]   view plain  copy
  1. <dependency>  
  2.     <groupId>junit</groupId>  
  3.     <artifactId>junit</artifactId>  
  4.     <version>4.8.2</version>  
  5.     <scope>test</scope>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>org.elasticsearch</groupId>  
  9.     <artifactId>elasticsearch</artifactId>  
  10.     <version>0.20.6</version>  
  11. </dependency>  
  12. <dependency>  
  13.     <groupId>org.elasticsearch</groupId>  
  14.     <artifactId>elasticsearch-analysis-paoding</artifactId>  
  15.     <version>1.0.0</version>  
  16.     <relativePath>../elasticsearch-analysis-paoding-master</relativePath>  
  17. </dependency>  
  18. <dependency>  
  19.     <groupId>com.fasterxml.jackson.core</groupId>  
  20.     <artifactId>jackson-databind</artifactId>  
  21.     <version>2.1.3</version>  
  22. </dependency>  

        请注意,引入elastic search-analysis-paoding的配置中,有一个relativePath,该配置指定了我们在第三步中导入的elasticsearch-analysis-paoding的位置,即Eclipse下同时存在esamine和elasticsearch-analysis-paoding-master两个项目。

        步骤五:在esample的src/main/resources(不存在则建立之,是个source folder)下分别添加config.properties和log4j.properties,此时esamine项目的代码结构如下所示:

        config.properties和log4j.properties内容如下所示:

[java]   view plain  copy
  1. ***********************config.properties***********************  
  2. cluster.name = elasticsearch  
  3. node.client = true  
  4. ***********************log4j.properties***********************  
  5. log4j.rootLogger=info, stdout, root, error  
  6. log4j.logger.org.apache.struts2.util.TextProviderHelper=ERROR  
  7.   
  8. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  9. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  10. #log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r - %m%n  
  11. log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n  
  12.   
  13. log4j.appender.root=org.apache.log4j.RollingFileAppender  
  14. log4j.appender.root.File=${webapp.root}/log/gcr_log.log  
  15. log4j.appender.root.MaxFileSize=512KB  
  16. log4j.appender.root.MaxBackupIndex=5  
  17. log4j.appender.root.encoding=UTF-8   
  18. log4j.appender.root.layout=org.apache.log4j.PatternLayout  
  19. log4j.appender.root.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n  
  20.   
  21. log4j.appender.error=org.apache.log4j.RollingFileAppender  
  22. log4j.appender.error.File=${webapp.root}/log/gcr_error_log.log  
  23. log4j.appender.error.MaxFileSize=512KB  
  24. log4j.appender.error.MaxBackupIndex=5  
  25. log4j.appender.error.encoding=UTF-8   
  26. log4j.appender.error.Threshold = ERROR     
  27. log4j.appender.error.append=true  
  28. log4j.appender.error.layout=org.apache.log4j.PatternLayout  
  29. log4j.appender.error.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r(%C:%M) - %m%n  

        注意,当前 配置的config.properties文件中配置的cluster.name为该ES(项目)所在的集群的名字,我们知道,当你下载并启动一个Elasticsearch时,它的集群名字默认为elasticsearch,为了减少配置,我们直接使用这个名字。

        步骤六:在esmple中新建四个类,分别为Person、ElasticSearchUtil、LoggerFactory和PropertyManager,建立后结构如下图所示:


        这四个类的内容如下所示:

[java]   view plain  copy
  1. ******************************Person.java******************************  
  2. /** 
  3.  * @author Geloin 
  4.  */  
  5. package com.geloin.esample.entity;  
  6.   
  7. /** 
  8.  * 测试使用的实体 
  9.  *  
  10.  * @author Geloin 
  11.  *  
  12.  */  
  13. public class Person {  
  14.   
  15.     /** 
  16.      * 惟一编码 
  17.      */  
  18.     private String id;  
  19.   
  20.     /** 
  21.      * 名称 
  22.      */  
  23.     private String name;  
  24.   
  25.     /** 
  26.      * 性别 
  27.      */  
  28.     private String sex;  
  29.   
  30.     /** 
  31.      * 年龄 
  32.      */  
  33.     private Integer age;  
  34.   
  35.     /** 
  36.      * 是否学生 
  37.      */  
  38.     private Boolean isStudent;  
  39.   
  40.     public String getId() {  
  41.         return id;  
  42.     }  
  43.   
  44.     public void setId(String id) {  
  45.         this.id = id;  
  46.     }  
  47.   
  48.     public String getName() {  
  49.         return name;  
  50.     }  
  51.   
  52.     public void setName(String name) {  
  53.         this.name = name;  
  54.     }  
  55.   
  56.     public String getSex() {  
  57.         return sex;  
  58.     }  
  59.   
  60.     public void setSex(String sex) {  
  61.         this.sex = sex;  
  62.     }  
  63.   
  64.     public Integer getAge() {  
  65.         return age;  
  66.     }  
  67.   
  68.     public void setAge(Integer age) {  
  69.         this.age = age;  
  70.     }  
  71.   
  72.     public Boolean getIsStudent() {  
  73.         return isStudent;  
  74.     }  
  75.   
  76.     public void setIsStudent(Boolean isStudent) {  
  77.         this.isStudent = isStudent;  
  78.     }  
  79.   
  80. }  
  81. ******************************ElasticSearchUtil.java******************************  
  82. /** 
  83.  * @author Geloin 
  84.  */  
  85. package com.geloin.esample.util;  
  86.   
  87. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;  
  88. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;  
  89. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;  
  90. import org.elasticsearch.client.Client;  
  91. import org.elasticsearch.node.Node;  
  92. import org.elasticsearch.node.NodeBuilder;  
  93.   
  94. import com.fasterxml.jackson.core.JsonProcessingException;  
  95. import com.fasterxml.jackson.databind.ObjectMapper;  
  96.   
  97. /** 
  98.  * ES工具类 
  99.  *  
  100.  * @author Geloin 
  101.  *  
  102.  */  
  103. public class ElasticSearchUtil {  
  104.   
  105.     /** 
  106.      * 索引库是否存在 
  107.      *  
  108.      * @author Geloin 
  109.      * @param client 
  110.      *            客户端 
  111.      * @param index 
  112.      *            索引库名 
  113.      * @return 存在则返回true,不存在则返回false 
  114.      */  
  115.     public static Boolean indexExist(Client client, String index) {  
  116.         IndicesExistsRequest request = new IndicesExistsRequestBuilder(client  
  117.                 .admin().indices(), index).request();  
  118.         IndicesExistsResponse response = client.admin().indices()  
  119.                 .exists(request).actionGet();  
  120.         return response.exists();  
  121.     }  
  122.   
  123.     /** 
  124.      * 生成客户端 
  125.      *  
  126.      * @author Geloin 
  127.      * @return 客户端 {@link Client} 
  128.      */  
  129.     public static Client createClient() {  
  130.         NodeBuilder builder = NodeBuilder.nodeBuilder();  
  131.         String clusterName = PropertyManager.getContextProperty("cluster.name");  
  132.         builder.clusterName(clusterName);  
  133.   
  134.         Boolean isClient = Boolean.parseBoolean(PropertyManager  
  135.                 .getContextProperty("node.client"));  
  136.         builder.client(isClient);  
  137.   
  138.         Node node = builder.node();  
  139.         return node.client();  
  140.     }  
  141.   
  142.     /** 
  143.      * 将Bean转化为JSon 
  144.      *  
  145.      * @author Geloin 
  146.      * @param obj 
  147.      *            要转化的Bean 
  148.      * @return 转化后的结果 
  149.      */  
  150.     public static String BeanToJson(Object obj) {  
  151.         ObjectMapper mapper = new ObjectMapper();  
  152.         try {  
  153.             return mapper.writeValueAsString(obj);  
  154.         } catch (JsonProcessingException e) {  
  155.             e.printStackTrace();  
  156.             return new String();  
  157.         }  
  158.     }  
  159. }  
  160.   
  161. ******************************LoggerFactory.java******************************  
  162. /** 
  163.  * @author Geloin 
  164.  */  
  165. package com.geloin.esample.util;  
  166.   
  167. import org.apache.log4j.Level;  
  168. import org.apache.log4j.Logger;  
  169.   
  170. /** 
  171.  * 日志工具类 
  172.  *  
  173.  * @author Geloin 
  174.  *  
  175.  */  
  176. public class LoggerFactory extends Logger {  
  177.   
  178.     protected LoggerFactory(String name) {  
  179.         super(name);  
  180.     }  
  181.   
  182.     /** 
  183.      * 新建实例 
  184.      *  
  185.      * @author Geloin 
  186.      * @param name 
  187.      *            名称 
  188.      * @return 建立的实例 
  189.      */  
  190.     public static Logger getInstance(String name) {  
  191.         Logger log = Logger.getLogger(name);  
  192.         log.setLevel(Level.ERROR);  
  193.         return log;  
  194.     }  
  195.   
  196.     /** 
  197.      * 新建实例,并指定level 
  198.      *  
  199.      * @author Geloin 
  200.      * @param name 
  201.      *            名称 
  202.      * @param level 
  203.      *            level 
  204.      * @return 建立的实例 
  205.      */  
  206.     public static Logger getInstance(String name, Level level) {  
  207.         Logger log = Logger.getLogger(name);  
  208.         log.setLevel(level);  
  209.         return log;  
  210.     }  
  211.   
  212.     /** 
  213.      * 根据类名新建实例 
  214.      *  
  215.      * @author Geloin 
  216.      * @param clazz 
  217.      *            类名 
  218.      * @return 实例 
  219.      */  
  220.     public static <T> Logger getInstance(Class<T> clazz) {  
  221.         Logger log = Logger.getLogger(clazz.getName());  
  222.         log.setLevel(Level.ERROR);  
  223.         return log;  
  224.     }  
  225.   
  226.     /** 
  227.      * 根据类名新建实例,并指定level 
  228.      *  
  229.      * @author Geloin 
  230.      * @param clazz 
  231.      *            类 
  232.      * @param level 
  233.      *            level 
  234.      * @return 实例 
  235.      */  
  236.     public static <T> Logger getInstance(Class<T> clazz, Level level) {  
  237.         Logger log = Logger.getLogger(clazz.getName());  
  238.         log.setLevel(level);  
  239.         return log;  
  240.     }  
  241. }  
  242.   
  243. ******************************PropertyManager.java******************************  
  244. /** 
  245.  * @author Geloin 
  246.  */  
  247. package com.geloin.esample.util;  
  248.   
  249. import java.io.File;  
  250. import java.io.FileInputStream;  
  251. import java.util.Enumeration;  
  252. import java.util.HashMap;  
  253. import java.util.Map;  
  254. import java.util.Properties;  
  255.   
  256. /** 
  257.  * 资源文件管理器 
  258.  *  
  259.  * @author Geloin 
  260.  *  
  261.  */  
  262. public class PropertyManager {  
  263.     private static Map<String, String> ctxPropertiesMap = null;  
  264.     static {  
  265.         try {  
  266.             String path = PropertyManager.class.getResource("/config")  
  267.                     .getPath();  
  268.             File dic = new File(path);  
  269.             ctxPropertiesMap = new HashMap<String, String>();  
  270.             for (File file : dic.listFiles()) {  
  271.                 if (file.getName().endsWith(".properties")) {  
  272.                     Properties prop = new Properties();  
  273.                     prop.load(new FileInputStream(file));  
  274.                     Enumeration<Object> keys = prop.keys();  
  275.                     while (keys.hasMoreElements()) {  
  276.                         String key = keys.nextElement().toString();  
  277.                         String value = prop.getProperty(key);  
  278.                         ctxPropertiesMap.put(key, value);  
  279.                     }  
  280.                 }  
  281.             }  
  282.         } catch (Exception e) {  
  283.             // do nothing  
  284.         }  
  285.     }  
  286.   
  287.     /** 
  288.      * 获取配置属性. 
  289.      *  
  290.      * @param name 
  291.      * @return String 
  292.      */  
  293.     public static String getContextProperty(String name) {  
  294.         return (String) ctxPropertiesMap.get(name);  
  295.     }  
  296. }  



http://blog.csdn.net/geloin/article/details/8934289

猜你喜欢

转载自blog.csdn.net/mingtianhaiyouwo/article/details/74907681