花有重开日,人无再少年
Elasticsearch简介
ElaticSearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
Elasticsearch的安装与启动
笔者开发环境使用的是1.8JDK版本;
Elasticsearch版本为5.6.8,分词器使用IK分词器,请自行下载。
安装es和ik分词器
注意安装目录不要有中文和特殊字符,笔者将其放在磁盘根目录下。并将分词器解压放入plugins目录并重命名为ik,修改配置文件并创建停用词和自定义词条文件。
准备完毕后启动es,如果闪退请降低配置内存,
正常启动后浏览器访问本地9200端口,出现如下界面说明安装成功。
安装es图形化界面–>elasticsearch-head-master
解压elasticsearch-head-master,同样放到了磁盘根目录。
需要提前准备node.js环境,笔者用的版本为8.9.4
然后安装grunt构建工具,在head目录启动dos窗口,在命令提示符下输入命令:
grunt server
解决跨域访问:
修改elasticsearch/config下的配置文件:elasticsearch.yml,增加以下三句命令:
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1
重启Elasticsearch。
本地访问9100端口,出现以下页面说明安装成功,至此所有准备工作完成。
ElasticSearch相关概念(术语)
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储(store),还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
- 索引index:一个索引就是一个拥有几分相似特征的文档(记录[数据])的集合。类似于database
- 类型type:在一个索引中,你可以定义一种或多种类型。类似table
- 文档document:一个文档是一个可被索引的基础信息单元,类似于一条记录
- 域field:对文档数据根据不同属性进行的分类标识,类似于字段
- 映射mapping:指定field的类型和属性。
Elasticsearch编程操作
搭建工程
工程坐标:
<groupId>pers.buyusan</groupId>
<artifactId>elasticsearch-day1-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
添加依赖:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
代码全部在测试类中进行:
提取公共部分:
private TransportClient client;
@Before
public void setUp() throws Exception{
//不使用集群,创建TransprotClient对象
client = new PreBuiltTransportClient(Settings.EMPTY);
//配置连接信息,ip+端口
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
}
@After
public void close(){
//关闭资源
client.close();
}
创建索引
只创建索引:
client.admin().indices().prepareCreate("buyusanjrs").get();
执行结果:
删除索引
删除名称为“buyusanjrs”的索引:
client.admin().indices().prepareDelete("buyusanjrs").get();
创建映射(基于jsonBuilder)
创建索引后如果不创建映射,es会根据默认根据文档的数据来创建。
如果需要指定ik分词器,则需要手动创建映射。
可以通过jsonBuilder对象来创建映射。
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type","long")
.endObject()
.startObject("title")
.field("type","string")
.field("store","false")
.field("analyzer","ik_smart")
.endObject()
.startObject("content")
.field("type","string")
.f