ElasticSearch 入门

1、介绍

ElasticSearch是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。ElasticSearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。

不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

2、安装包下载

最新版本:Elasticsearch 2.3.5
http://www.elasticsearch.org/download/

官方视频教程
http://www.elasticsearch.org/videos/

我自己目前使用的安装包(以下是基于我自己安装包写的)
链接:http://pan.baidu.com/s/1pL7y0YZ 密码:hwl0

3、文件目录结构

ElasticSearch 入门_第1张图片
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"
}

4、Java 模拟简单搜索

实体类:

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 目录下没有内容,运行程序之后会建立如下目录:

ElasticSearch 入门_第2张图片

控制台输出信息:

查询到记录数=1
查询到记录数=^^^1
(1):小平      山西-晋城

5、集群管理工具查看信息

ElasticSearch 安装插件 elasticsearch-head 插件
ElasticSearch 入门_第3张图片
安装完之后,在 elasticsearch-1.4.0\plugins 目录下就多了 head 插件,直接打开目录中的 index.html 文件即可进入管理工具

Mind 总结图:
ElasticSearch 入门_第4张图片

你可能感兴趣的:(搜索引擎)