您的位置:首页 > 其它

分布式搜索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的内容如下所示:

#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: