ElasticSearch是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。ElasticSearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。
不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
最新版本:Elasticsearch 2.3.5
http://www.elasticsearch.org/download/
官方视频教程
http://www.elasticsearch.org/videos/
我自己目前使用的安装包(以下是基于我自己安装包写的)
链接:http://pan.baidu.com/s/1pL7y0YZ 密码:hwl0
bin 是运行的脚本
config 是配置文件
data 是数据文件
lib 是程序依赖包
logs 是日志文件
plugins 是集群管理工具文件
导入 lib 中的 jar 包,双击 bin 目录下的 elasticsearch.bat 文件启动 elasticsearch,第一次启动成功后data 和 logs 文件就会产生,此时在浏览器输入 http://localhost:9200/ ,出现如下结果表示启动成功:
{
"status" : 200,
"name" : "Mister Machine",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.4.0",
"build_hash" : "bc94bd81298f81c656893ab1ddddd30a99356066",
"build_timestamp" : "2014-11-05T14:26:12Z",
"build_snapshot" : false,
"lucene_version" : "4.10.2"
},
"tagline" : "You Know, for Search"
}
实体类:
public class Student {
private Integer id;
private String name;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student(Integer id, String name, String address) {
super();
this.id = id;
this.name = name;
this.address = address;
}
}
模拟数据:
import java.util.ArrayList;
import java.util.List;
public class DataFactory {
public static DataFactory dataFactory = new DataFactory();
private DataFactory(){
}
public DataFactory getInstance(){
return dataFactory;
}
public static List<String> getInitJsonData(){
List<String> list = new ArrayList<String>();
String student1 = JsonUtil.objJsonData(new Student(1,"小平","山西-晋城"));
String student2 = JsonUtil.objJsonData(new Student(2,"小丽","山西-长治"));
String student3 = JsonUtil.objJsonData(new Student(3,"小梅","山西-晋中"));
list.add(student1);
list.add(student2);
list.add(student3);
return list;
}
}
json 工具类:
import java.io.IOException;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
public class JsonUtil {
/**
* 实现将实体对象转换成json对象
* @param student Student对象
* @return
*/
public static String objJsonData(Student student) {
String jsonData = null;
try {
// 使用XContentBuilder创建json数据
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject()
.field("id", student.getId())
.field("name", student.getName())
.field("address", student.getAddress())
.endObject();
jsonData = builder.string();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonData;
}
}
ElasticSearch 搜索模拟类:
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
public class ElasticSearchHandler {
private Client client;
private static String INDEX_NAME = "index_student";
private static String TYPE_NAME = "type_student";
public ElasticSearchHandler(){
//使用本机做为节点
this("127.0.0.1");
}
public ElasticSearchHandler(String ipAddress){
//集群连接超时设置
/*
Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").build();
client = new TransportClient(settings);
*/
client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));
}
/**
* 建立索引,索引建立好之后,会在elasticsearch-1.4.0\data\elasticsearch\nodes\0创建相关数据文件
* @param indexName 为索引库名,一个es集群中可以有多个索引库。 名称必须为小写,可以带下划线
* @param indexType Type为索引类型,是用来区分同索引库下不同类型的数据的,一个索引库下可以有多个索引类型。
* @param jsondata json格式的数据集合
*
* @return
*/
public void createIndexResponse(String indexname, String type, List jsondata){
//创建索引库 需要注意的是.setRefresh(true)这里一定要设置,否则第一次建立索引查找不到数据
IndexRequestBuilder requestBuilder = client.prepareIndex(indexname, type).setRefresh(true);
for(int i=0; i/**
* 执行搜索
* @param queryBuilder
* @param indexname
* @param type
* @return
*/
public List searcher(QueryBuilder queryBuilder, String indexname, String type){
List list = new ArrayList();
SearchResponse searchResponse = client.prepareSearch(indexname)
.setTypes(type)
.setQuery(queryBuilder)
.execute()
.actionGet();
SearchHits hits = searchResponse.getHits();
System.out.println("查询到记录数=" + hits.getTotalHits());
System.out.println("查询到记录数=^^^" + hits.getHits().length);
SearchHit[] searchHists = hits.getHits();
if(searchHists.length>0){
for(SearchHit hit:searchHists){
Integer id = (Integer)hit.getSource().get("id");
String name = (String) hit.getSource().get("name");
String address = (String) hit.getSource().get("address");
list.add(new Student(id, name, address));
}
}
return list;
}
/**
* 判断该节点是否已经存在
* @param indexName
* @return
*/
public boolean isExistsIndex(String indexName) {
IndicesExistsResponse response = client
.admin()
.indices()
.exists(new IndicesExistsRequest(indexName))
.actionGet();
return response.isExists();
}
public static void main(String[] args) {
ElasticSearchHandler esHandler = new ElasticSearchHandler();
List jsondata = DataFactory.getInitJsonData();
//判断索引是否已经存在
if (!esHandler.isExistsIndex(INDEX_NAME)) {
esHandler.createIndexResponse(INDEX_NAME, TYPE_NAME, jsondata);
}
//查询条件
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", "1"));
List result = esHandler.searcher(queryBuilder, INDEX_NAME, TYPE_NAME);
for(int i=0; i"(" + student.getId() + "):" +student.getName() + "\t\t" + student.getAddress());
}
}
}
程序运行前 nodes 目录下没有内容,运行程序之后会建立如下目录:
控制台输出信息:
查询到记录数=1
查询到记录数=^^^1
(1):小平 山西-晋城
ElasticSearch 安装插件 elasticsearch-head 插件
安装完之后,在 elasticsearch-1.4.0\plugins 目录下就多了 head 插件,直接打开目录中的 index.html 文件即可进入管理工具