一晃小半年过去了,好几个月没写过博客了。其实手早就痒的不行了,终于在这个天时地利人和的下午,有点时间写点东西了。对于全文检索这块,自己之前只了解过
luncence
,但也仅仅是了解,只知道其大概的原理,但一直没有机会使用。最近的项目终于有机会能用全文检索了,于是就霹雳吧啦查了一顿资料,最后决定了使用luncence
的升级版——elasticsearch
(以下简称es,这名字太长了,手疼)。
在这个万物基于springboot
的时代,要在项目中使用es其实是件很容易的事。而且在springboot
的官方手册中有完整的集成es的章节。不过,纸上学来终觉浅,绝知此事要躬行,什么事都得自己试试才知道。
这里插一下es的原理。es中使用了倒排索引的概念,就是把一大段文本按照一定的规则进行分词,然后将每个词在整个文本中出现的位置、次数等都记录下来,并将所有的词进行排序和索引。利用这样一种存储结构就能很容易的判断一大段文本中是否包含某个关键字了。
es的安装
我现在是越来越懒了,以前钟爱手动下载压缩包,手动解压,手动配置,手动启动程序,而现在呢,我就喜欢yum,能用一条命令搞定的事情,绝不用两条命令。所以es的安装我也是用yum搞定的(以下步骤都是基于centos7的)。
- 首先配置yum仓库,在
/etc/yum.repos.d/
下创建个文件名为elasticsearch.repo
,并编辑内容如下:
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
如果后续安装失败可以考虑把gpgcheck=1
改为gpgcheck=0
- 安装es
yum install elasticsearch -y
- 启动es
systemctl start elasticsearch
- 配置允许远程访问。编辑
/etc/elasticsearch/elasticsearch.yml
文件,找到network.host
这一项,将其改为network.host: 0.0.0.0
,注意不要少冒号后的空格。 - 配置es,允许跨域(强烈建议配置此项)。编辑
/etc/elasticsearch/elasticsearch.yml
文件,在其最后添加如下内容:http.cors.enabled: true http.cors.allow-origin: "*"
- 重启es(滑稽):
systemctl restart elasticsearch
- 使用elasticsearch-head(https://github.com/mobz/elasticsearch-head )连接es,如果看到如下内容,就大功告成了:
springboot中集成es
- 添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 添加数据库连接地址:
在application.properties
配置文件中添加spring.data.elasticsearch.cluster-nodes=192.168.1.2:9300
- 启用es:在启动类上添加注解:
@EnableElasticsearchRepositories(value="com.simon.demo.dao")
在代码中使用es
es有两种使用方式,一种是像
springdata
那样,编写接口;另一种是使用ElasticsearchTemplate
- 以接口的形式使用es:
public interface DemoElasticsearchRepository extends ElasticsearchRepository<DemoEntity, String> {
@Query("{ \"match\" : { \"field1\" : \"?0\" }}")
public List<DemoEntity> findByText(String text);
}
这里注意几点:
- 接口要位于
com.simon.demo.dao
这个路径下(这个路径和EnableElasticsearchRepositories
注解遥相呼应) - 自定义的接口可以继承ElasticsearchRepository,这样能省不少事
- 可以使用
@Query
这种注解来制定查询/修改语句
- 使用
ElasticsearchTemplate
在代码的任何地方,都可以@ElasticsearchTemplate,就像这样:
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
然后就可以使用ElasticsearchTemplate
来执行较为复杂的操作了。
最后有个小细节要注意下,程序中都是用的9300端口连接的es,但在elasticsearch-head都是用9200端口(9200是rest端口)。