分布式搜索Elasticsearch——项目过程(二)
2013-05-16 11:43
417 查看
步骤七:将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的内容如下所示:
步骤九:在esmple的src/test/java下添加BaseTest、TermQueryTest、MatchQueryTest、MatchAllQueryTest四个类,添加后结构如下所示:
这四个类的内容如下所示:
步骤十:到步骤一安排的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。
步骤八:将elasticsearch-analysis-paoding-master项目中的config/paoding/paoding-analyzer.properties文件复制到esmple项目中的src/main/resources/config/paoding/文件夹下,复制后esmple的文件结构如下所示:
paoding-analyzer.properties的内容如下所示:
#PaodingAnlyzer Mode, "most-words", "max-word-length", "class:com.xxx.MyTokenCollectorImpl"... paoding.analyzer.mode=most-words paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler #paoding.analyzer.mode=max-word-length #paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler #values are "system-env" or "this"; #if value is "this" , using the paoding.dic.home as dicHome if configed! #paoding.dic.home.config-first=system-env #dictionary home (directory) #"classpath:xxx" means dictionary home is in classpath. #e.g "classpath:dic" means dictionaries are in "classes/dic" directory or any other classpath directory paoding.dic.home=d:/dic #seconds for dic modification detection paoding.dic.detector.interval=60 # an example of knife with properties setting #paoding.knife.class.fakeKnife=net.paoding.analysis.knife.FakeKnife #paoding.knife.class.fakeKnife.name=Fake Knife #paoding.knife.class.fakeKnife.intParam=34 #paoding.knife.class.fakeKnife.inner.bool=true paoding.knife.class.letterKnife=net.paoding.analysis.knife.LetterKnife paoding.knife.class.numberKnife=net.paoding.analysis.knife.NumberKnife paoding.knife.class.cjkKnife=net.paoding.analysis.knife.CJKKnife
步骤九:在esmple的src/test/java下添加BaseTest、TermQueryTest、MatchQueryTest、MatchAllQueryTest四个类,添加后结构如下所示:
这四个类的内容如下所示:
******************************BaseTest.java****************************** /** * @author Geloin */ package com.geloin.esample; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.elasticsearch.client.Client; import com.fasterxml.jackson.databind.ObjectMapper; import com.geloin.esample.util.ElasticSearchUtil; import com.geloin.esample.util.LoggerFactory; /** * @author Geloin * */ public class BaseTest { protected static Logger log = LoggerFactory.getInstance(BaseTest.class, Level.INFO); protected static String index = "user"; protected static String type = "tb_person"; protected static Client client = ElasticSearchUtil.createClient(); protected static ObjectMapper mapper = new ObjectMapper(); } ******************************TermQueryTest.java****************************** /** * @author Geloin */ package com.geloin.esample.util; import java.util.UUID; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; import com.geloin.esample.BaseTest; import com.geloin.esample.entity.Person; /** * @author Geloin * */ public class TermQueryTest extends BaseTest { @Test public void termQuery() { String index = "user"; String type = "tb_person"; try { // 创建索引 Person p = new Person(); p.setId(UUID.randomUUID().toString()); p.setAge(20); p.setIsStudent(false); p.setSex("男"); p.setName("别克"); ObjectMapper mapper = new ObjectMapper(); String source = mapper.writeValueAsString(p); client.prepareIndex(index, type, p.getId()).setSource(source) .execute().actionGet(); // 查询 QueryBuilder qb = QueryBuilders.termQuery("name", "别"); SearchResponse sResponse = client.prepareSearch(index) .setTypes(type).setQuery(qb).setFrom(0).setSize(12) .execute().actionGet(); SearchHits hits = sResponse.getHits(); if (null != hits && hits.totalHits() > 0) { for (SearchHit hit : hits) { String json = hit.getSourceAsString(); Person newPerson = mapper.readValue(json, Person.class); System.out.println("name\t\t" + newPerson.getName()); System.out.println("sex\t\t" + newPerson.getSex()); System.out.println("age\t\t" + newPerson.getAge()); System.out.println("isStudent\t\t" + newPerson.getIsStudent()); } } else { log.info("没有查询到任何结果!"); } // 防止出现:远程主机强迫关闭了一个现有的连接 Thread.sleep(100000); } catch (Exception e) { e.printStackTrace(); } } } ******************************MatchAllQueryTest.java****************************** /** * @author Geloin */ package com.geloin.esample.util; import java.util.UUID; import junit.framework.Assert; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.Test; import com.geloin.esample.BaseTest; import com.geloin.esample.entity.Person; /** * @author Geloin * */ public class MatchAllQueryTest extends BaseTest { @Test public void matchAllQuery() { try { BulkRequestBuilder builder = client.prepareBulk(); // 创建索引 for (int i = 0; i < 10; i++) { Person p = new Person(); p.setAge(20 + i); p.setId(UUID.randomUUID().toString()); p.setIsStudent(true); p.setName("小别克听老别克讲别克的故事" + i); p.setSex("男"); String source = ElasticSearchUtil.BeanToJson(p); IndexRequest request = client .prepareIndex(index, type, p.getId()).setSource(source) .request(); builder.add(request); } BulkResponse response = builder.execute().actionGet(); if (response.hasFailures()) { Assert.fail("创建索引失败!"); } // 检索 QueryBuilder qb = QueryBuilders.matchAllQuery(); SearchResponse sr = client.prepareSearch(index).setTypes(type) // .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(qb).setFrom(0).setSize(12).execute().actionGet(); SearchHits hits = sr.getHits(); if (null != hits && hits.totalHits() > 0) { for (SearchHit hit : hits) { String json = hit.getSourceAsString(); Person newPerson = mapper.readValue(json, Person.class); System.out.println("name\t\t" + newPerson.getName()); System.out.println("sex\t\t" + newPerson.getSex()); System.out.println("age\t\t" + newPerson.getAge()); System.out.println("isStudent\t\t" + newPerson.getIsStudent()); } } else { log.error("没有查询到任何内容!"); return; } // 查询总数量 long count = client.prepareCount(index).setTypes(type).setQuery(qb).execute().actionGet().count(); log.info("符合条件的总数量为:" + count); Thread.sleep(1000000); } catch (Exception e) { e.printStackTrace(); } } } ******************************MatchQueryTest.java****************************** /** * @author Geloin */ package com.geloin.esample.util; import java.util.UUID; import junit.framework.Assert; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.junit.Test; import com.geloin.esample.BaseTest; import com.geloin.esample.entity.Person; /** * @author Geloin * */ public class MatchQueryTest extends BaseTest { @Test public void matchQuery() { try { String name = "name"; String text = "别克"; BulkRequestBuilder requestBuilder = client.prepareBulk(); // 创建索引 for (int i = 0; i < 10; i++) { Person p = new Person(); p.setAge(20 + i); p.setId(UUID.randomUUID().toString()); p.setIsStudent(true); p.setName("小别克听老别克讲别克的故事" + i); p.setSex("男"); String source = ElasticSearchUtil.BeanToJson(p); IndexRequest request = client .prepareIndex(index, type, p.getId()).setSource(source) .request(); requestBuilder.add(request); } BulkResponse response = requestBuilder.execute().actionGet(); if (response.hasFailures()) { Assert.fail("创建索引失败!"); } // 检索 QueryBuilder qb = QueryBuilders.matchQuery(name, text); SearchResponse searchResponse = client.prepareSearch(index) .setTypes(type).setQuery(qb).setFrom(0).setSize(12) .execute().actionGet(); SearchHits hits = searchResponse.getHits(); if (null == hits || hits.totalHits() == 0) { log.error("没有查询到任何结果!"); return; } else { for (SearchHit hit : hits) { String json = hit.getSourceAsString(); Person newPerson = mapper.readValue(json, Person.class); System.out.println("name\t\t" + newPerson.getName()); System.out.println("sex\t\t" + newPerson.getSex()); System.out.println("age\t\t" + newPerson.getAge()); System.out.println("isStudent\t\t" + newPerson.getIsStudent()); } } Thread.sleep(1000000); } catch (Exception e) { e.printStackTrace(); } } }
步骤十:到步骤一安排的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。
相关文章推荐
- 分布式搜索Elasticsearch——项目过程(一)
- 分布式搜索Elasticsearch——项目过程(一)
- 分布式搜索Elasticsearch——集成paoding
- 分布式搜索Elasticsearch——创建客户端(三)
- 分布式搜索Elasticsearch——配置
- 分布式搜索Elasticsearch——搜索(二)
- 分布式搜索Elasticsearch——MultiSearch
- 分布式搜索Elasticsearch——QueryBuilders.matchQuery
- 分布式搜索Elasticsearch——配置
- 分布式搜索Elasticsearch——QueryBuilders.termQuery
- 分布式搜索Elasticsearch——QueryBuilders.matchPhrasePrefixQuery
- 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
- 分布式搜索Elasticsearch——创建客户端(四)
- 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
- 分布式搜索Elasticsearch——创建客户端(五)
- 分布式搜索Elasticsearch——QueryBuilders.matchPhrasePrefixQuery
- 分布式搜索Elasticsearch——集成paoding-maping
- (转)分布式搜索Elasticsearch——配置
- 分布式搜索Elasticsearch——概述
- 分布式搜索Elasticsearch——创建索引