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

来源:互联网 发布:ipad游戏大厅网络异常 编辑:程序博客网 时间:2024/06/16 16:21

步骤七:将elasticsearch-analysis-paoding-master项目中的config/paoding/dic文件夹复制到硬盘上的任一目录,假设为d:\dic;

        步骤八:将elasticsearch-analysis-paoding-master项目中的config/paoding/paoding-analyzer.properties文件复制到esmple项目中的src/main/resources/config/paoding/文件夹下,复制后esmple的文件结构如下所示:

        paoding-analyzer.properties的内容如下所示:

[java] view plain copy
  1. #PaodingAnlyzer Mode, "most-words""max-word-length""class:com.xxx.MyTokenCollectorImpl"...  
  2. paoding.analyzer.mode=most-words  
  3. paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler  
  4. #paoding.analyzer.mode=max-word-length  
  5. #paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler  
  6.   
  7.   
  8.   
  9. #values are "system-env" or "this";  
  10. #if value is "this" , using the paoding.dic.home as dicHome if configed!  
  11. #paoding.dic.home.config-first=system-env  
  12.   
  13. #dictionary home (directory)  
  14. #"classpath:xxx" means dictionary home is in classpath.  
  15. #e.g "classpath:dic" means dictionaries are in "classes/dic" directory or any other classpath directory  
  16. paoding.dic.home=d:/dic  
  17.   
  18. #seconds for dic modification detection  
  19. paoding.dic.detector.interval=60  
  20.   
  21.   
  22.   
  23.   
  24. # an example of knife with properties setting  
  25. #paoding.knife.class.fakeKnife=net.paoding.analysis.knife.FakeKnife  
  26. #paoding.knife.class.fakeKnife.name=Fake Knife  
  27. #paoding.knife.class.fakeKnife.intParam=34  
  28. #paoding.knife.class.fakeKnife.inner.bool=true  
  29.   
  30.   
  31.   
  32. paoding.knife.class.letterKnife=net.paoding.analysis.knife.LetterKnife  
  33. paoding.knife.class.numberKnife=net.paoding.analysis.knife.NumberKnife  
  34. paoding.knife.class.cjkKnife=net.paoding.analysis.knife.CJKKnife  

        步骤九:在esmple的src/test/java下添加BaseTest、TermQueryTest、MatchQueryTest、MatchAllQueryTest四个类,添加后结构如下所示:

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

[java] view plain copy
  1. ******************************BaseTest.java******************************  
  2. /** 
  3.  * @author Geloin 
  4.  */  
  5. package com.geloin.esample;  
  6.   
  7. import org.apache.log4j.Level;  
  8. import org.apache.log4j.Logger;  
  9. import org.elasticsearch.client.Client;  
  10.   
  11. import com.fasterxml.jackson.databind.ObjectMapper;  
  12. import com.geloin.esample.util.ElasticSearchUtil;  
  13. import com.geloin.esample.util.LoggerFactory;  
  14.   
  15. /** 
  16.  * @author Geloin 
  17.  * 
  18.  */  
  19. public class BaseTest {  
  20.     protected static Logger log = LoggerFactory.getInstance(BaseTest.class, Level.INFO);  
  21.     protected static String index = "user";  
  22.     protected static String type = "tb_person";  
  23.     protected static Client client = ElasticSearchUtil.createClient();  
  24.     protected static ObjectMapper mapper = new ObjectMapper();  
  25. }  
  26.   
  27. ******************************TermQueryTest.java******************************  
  28. /** 
  29.  * @author Geloin 
  30.  */  
  31. package com.geloin.esample.util;  
  32.   
  33. import java.util.UUID;  
  34.   
  35. import org.elasticsearch.action.search.SearchResponse;  
  36. import org.elasticsearch.index.query.QueryBuilder;  
  37. import org.elasticsearch.index.query.QueryBuilders;  
  38. import org.elasticsearch.search.SearchHit;  
  39. import org.elasticsearch.search.SearchHits;  
  40. import org.junit.Test;  
  41.   
  42. import com.fasterxml.jackson.databind.ObjectMapper;  
  43. import com.geloin.esample.BaseTest;  
  44. import com.geloin.esample.entity.Person;  
  45.   
  46. /** 
  47.  * @author Geloin 
  48.  *  
  49.  */  
  50. public class TermQueryTest extends BaseTest {  
  51.   
  52.     @Test  
  53.     public void termQuery() {  
  54.         String index = "user";  
  55.         String type = "tb_person";  
  56.         try {  
  57.             // 创建索引  
  58.             Person p = new Person();  
  59.             p.setId(UUID.randomUUID().toString());  
  60.             p.setAge(20);  
  61.             p.setIsStudent(false);  
  62.             p.setSex("男");  
  63.             p.setName("别克");  
  64.   
  65.             ObjectMapper mapper = new ObjectMapper();  
  66.             String source = mapper.writeValueAsString(p);  
  67.   
  68.             client.prepareIndex(index, type, p.getId()).setSource(source)  
  69.                     .execute().actionGet();  
  70.   
  71.             // 查询  
  72.             QueryBuilder qb = QueryBuilders.termQuery("name""别");  
  73.   
  74.             SearchResponse sResponse = client.prepareSearch(index)  
  75.                     .setTypes(type).setQuery(qb).setFrom(0).setSize(12)  
  76.                     .execute().actionGet();  
  77.             SearchHits hits = sResponse.getHits();  
  78.   
  79.             if (null != hits && hits.totalHits() > 0) {  
  80.                 for (SearchHit hit : hits) {  
  81.                     String json = hit.getSourceAsString();  
  82.                     Person newPerson = mapper.readValue(json, Person.class);  
  83.                     System.out.println("name\t\t" + newPerson.getName());  
  84.                     System.out.println("sex\t\t" + newPerson.getSex());  
  85.                     System.out.println("age\t\t" + newPerson.getAge());  
  86.                     System.out.println("isStudent\t\t"  
  87.                             + newPerson.getIsStudent());  
  88.                 }  
  89.             } else {  
  90.                 log.info("没有查询到任何结果!");  
  91.             }  
  92.   
  93.             // 防止出现:远程主机强迫关闭了一个现有的连接  
  94.             Thread.sleep(100000);  
  95.         } catch (Exception e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.   
  99.     }  
  100. }  
  101.   
  102. ******************************MatchAllQueryTest.java******************************  
  103. /** 
  104.  * @author Geloin 
  105.  */  
  106. package com.geloin.esample.util;  
  107.   
  108. import java.util.UUID;  
  109.   
  110. import junit.framework.Assert;  
  111.   
  112. import org.elasticsearch.action.bulk.BulkRequestBuilder;  
  113. import org.elasticsearch.action.bulk.BulkResponse;  
  114. import org.elasticsearch.action.index.IndexRequest;  
  115. import org.elasticsearch.action.search.SearchResponse;  
  116. import org.elasticsearch.index.query.QueryBuilder;  
  117. import org.elasticsearch.index.query.QueryBuilders;  
  118. import org.elasticsearch.search.SearchHit;  
  119. import org.elasticsearch.search.SearchHits;  
  120. import org.junit.Test;  
  121.   
  122. import com.geloin.esample.BaseTest;  
  123. import com.geloin.esample.entity.Person;  
  124.   
  125. /** 
  126.  * @author Geloin 
  127.  *  
  128.  */  
  129. public class MatchAllQueryTest extends BaseTest {  
  130.   
  131.     @Test  
  132.     public void matchAllQuery() {  
  133.         try {  
  134.   
  135.             BulkRequestBuilder builder = client.prepareBulk();  
  136.             // 创建索引  
  137.             for (int i = 0; i < 10; i++) {  
  138.                 Person p = new Person();  
  139.                 p.setAge(20 + i);  
  140.                 p.setId(UUID.randomUUID().toString());  
  141.                 p.setIsStudent(true);  
  142.                 p.setName("小别克听老别克讲别克的故事" + i);  
  143.                 p.setSex("男");  
  144.   
  145.                 String source = ElasticSearchUtil.BeanToJson(p);  
  146.   
  147.                 IndexRequest request = client  
  148.                         .prepareIndex(index, type, p.getId()).setSource(source)  
  149.                         .request();  
  150.   
  151.                 builder.add(request);  
  152.             }  
  153.   
  154.             BulkResponse response = builder.execute().actionGet();  
  155.             if (response.hasFailures()) {  
  156.                 Assert.fail("创建索引失败!");  
  157.             }  
  158.   
  159.             // 检索  
  160.             QueryBuilder qb = QueryBuilders.matchAllQuery();  
  161.             SearchResponse sr = client.prepareSearch(index).setTypes(type)  
  162. //                  .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)  
  163.                     .setQuery(qb).setFrom(0).setSize(12).execute().actionGet();  
  164.   
  165.             SearchHits hits = sr.getHits();  
  166.   
  167.             if (null != hits && hits.totalHits() > 0) {  
  168.                 for (SearchHit hit : hits) {  
  169.                     String json = hit.getSourceAsString();  
  170.   
  171.                     Person newPerson = mapper.readValue(json, Person.class);  
  172.                     System.out.println("name\t\t" + newPerson.getName());  
  173.                     System.out.println("sex\t\t" + newPerson.getSex());  
  174.                     System.out.println("age\t\t" + newPerson.getAge());  
  175.                     System.out.println("isStudent\t\t"  
  176.                             + newPerson.getIsStudent());  
  177.                 }  
  178.             } else {  
  179.                 log.error("没有查询到任何内容!");  
  180.                 return;  
  181.             }  
  182.   
  183.             // 查询总数量  
  184.             long count = client.prepareCount(index).setTypes(type).setQuery(qb).execute().actionGet().count();  
  185.               
  186.             log.info("符合条件的总数量为:" + count);  
  187.               
  188.             Thread.sleep(1000000);  
  189.         } catch (Exception e) {  
  190.             e.printStackTrace();  
  191.         }  
  192.     }  
  193. }  
  194.   
  195. ******************************MatchQueryTest.java******************************  
  196. /** 
  197.  * @author Geloin 
  198.  */  
  199. package com.geloin.esample.util;  
  200.   
  201. import java.util.UUID;  
  202.   
  203. import junit.framework.Assert;  
  204.   
  205. import org.elasticsearch.action.bulk.BulkRequestBuilder;  
  206. import org.elasticsearch.action.bulk.BulkResponse;  
  207. import org.elasticsearch.action.index.IndexRequest;  
  208. import org.elasticsearch.action.search.SearchResponse;  
  209. import org.elasticsearch.index.query.QueryBuilder;  
  210. import org.elasticsearch.index.query.QueryBuilders;  
  211. import org.elasticsearch.search.SearchHit;  
  212. import org.elasticsearch.search.SearchHits;  
  213. import org.junit.Test;  
  214.   
  215. import com.geloin.esample.BaseTest;  
  216. import com.geloin.esample.entity.Person;  
  217.   
  218. /** 
  219.  * @author Geloin 
  220.  *  
  221.  */  
  222. public class MatchQueryTest extends BaseTest {  
  223.   
  224.     @Test  
  225.     public void matchQuery() {  
  226.         try {  
  227.             String name = "name";  
  228.             String text = "别克";  
  229.             BulkRequestBuilder requestBuilder = client.prepareBulk();  
  230.             // 创建索引  
  231.             for (int i = 0; i < 10; i++) {  
  232.                 Person p = new Person();  
  233.                 p.setAge(20 + i);  
  234.                 p.setId(UUID.randomUUID().toString());  
  235.                 p.setIsStudent(true);  
  236.                 p.setName("小别克听老别克讲别克的故事" + i);  
  237.                 p.setSex("男");  
  238.   
  239.                 String source = ElasticSearchUtil.BeanToJson(p);  
  240.                 IndexRequest request = client  
  241.                         .prepareIndex(index, type, p.getId()).setSource(source)  
  242.                         .request();  
  243.   
  244.                 requestBuilder.add(request);  
  245.             }  
  246.             BulkResponse response = requestBuilder.execute().actionGet();  
  247.             if (response.hasFailures()) {  
  248.                 Assert.fail("创建索引失败!");  
  249.             }  
  250.   
  251.             // 检索  
  252.             QueryBuilder qb = QueryBuilders.matchQuery(name, text);  
  253.             SearchResponse searchResponse = client.prepareSearch(index)  
  254.                     .setTypes(type).setQuery(qb).setFrom(0).setSize(12)  
  255.                     .execute().actionGet();  
  256.   
  257.             SearchHits hits = searchResponse.getHits();  
  258.             if (null == hits || hits.totalHits() == 0) {  
  259.                 log.error("没有查询到任何结果!");  
  260.                 return;  
  261.             } else {  
  262.                 for (SearchHit hit : hits) {  
  263.                     String json = hit.getSourceAsString();  
  264.   
  265.                     Person newPerson = mapper.readValue(json, Person.class);  
  266.                     System.out.println("name\t\t" + newPerson.getName());  
  267.                     System.out.println("sex\t\t" + newPerson.getSex());  
  268.                     System.out.println("age\t\t" + newPerson.getAge());  
  269.                     System.out.println("isStudent\t\t"  
  270.                             + newPerson.getIsStudent());  
  271.                 }  
  272.             }  
  273.               
  274.             Thread.sleep(1000000);  
  275.         } catch (Exception e) {  
  276.             e.printStackTrace();  
  277.         }  
  278.     }  
  279. }  

        步骤十:到步骤一安排的ES文件夹下,找到bin/elasticsearch.bat,双击启动之,谨记:config/elasticsearch.yml下可配置cluster.name,请保持其值与esmine的config.properties文件中配置的一致。

       接着,就可以在TermQueryTest、MatchAllQueryTest或MatchQueryTest中执行单元测试了,请注意一个大概率事件:假设你现在执行TermQueryTest的测试,在第一次测试时,你可能查询不到结果,那是因为索引未创建成功即开始查询,所以如果出现第一次查询没有结果,你可以再执行一次TermQueryTest。

       关键配置:esmine中的config.properties中,node.client的值请设置为true,这样做的目的是使得esmine为一个客户端,而不用于存储数据,在此处进行配置的目的,是考虑到esmine可能部署多个,此时,你即可以设置某(些)个esmine为client,某(些)个esmine为client。

0 0
原创粉丝点击