1.什么是ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
ElasticSearch对事物的处理能力差,但是对数据检索的能力很强。
2.部属ElasticSearch
继续祭出我们的神奇的Docker。
-
docker pull elasticsearch
安装elasticsearch。 -
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name mysearch 671bb2d7da44
这里额外的参数要注意下,ES_JAVA_OPTS="-Xms256m -Xmx256m
为申请内存的大小,9200为服务访问端口,9300为在分布式情况下节点间通讯的接口。 -
此时我们访问本地的9200端口返回以下数据就说明部署成功。
访问9200端口
3.ElasticSearch入门教程
一切请参考ElasticSearch官方文档
4.SpringBoot与ElasticSearch
首先依旧查看SpringBoot中有关于ElasticSearch的自动配置类。
我们发现在两个方法可以操作ElasticSearch:
- Jest,基于HTTP的。
- SpringData操作,基于TCP。
a.Jest
- 首先添加Maven
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
- 配置文件,记得加上http://,使用的是9200端口
spring:
elasticsearch:
jest:
uris: http://192.168.15.128:9200
- 配置测试Bean文件,需要添加@JestID声明主键
ublic class UserBean {
@JestId
int id;
String name;
int age;
String password;
public UserBean(int id, String name, int age, String password) {
this.id = id;
this.name = name;
this.age = age;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
....
}
- 测试文件
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticApplicationTests {
@Autowired
JestClient jestClient;
@Test
public void save() {
UserBean userBean = new UserBean(1, "baozhou", 27, "123456");
//构建一个索引功能
Index build = new Index.Builder(userBean).index("indexname").type("users").build();
try {
//执行
jestClient.execute(build);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void search() {
String queryJson = "{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"name\" : \"baozhou\"\n" +
" }\n" +
" }\n" +
"}";
//构建一个搜索
Search build = new Search.Builder(queryJson).addIndex("indexname").addType("users").build();
try {
//执行
SearchResult result =jestClient.execute(build);
System.out.println(result.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
b.SpringData
使用SpringData非常曲折,在SpringBoot2.x
里折腾了半天也没有调通,最后使用了SpringBoot 1.x
。
首先一点需要注意的是SpringData于ElasticSearch是有版本对应规则的,详情对应参考https://github.com/spring-projects/spring-data-elasticsearch。
在SpringData下也有两种工具可以操作Elasticsearch,他们分别为ElasticsearchRepository
,ElasticsearchTemplate
。有关于他们的使用方法可以参考SpringData官方文档,当然接下来也要演示一下使用方法。
1. ElasticsearchRepository
- 配置文件
spring:
data:
elasticsearch:
cluster-nodes: 192.168.15.128:9301
cluster-name: elasticsearch
- Bean文件,注意添加标注,说明添加的索引以及类型。
@Document(indexName = "test", type = "book")
public class TestBean {
Integer id;
String name;
String author;
public TestBean(Integer id, String name, String author) {
https://github.com/spring-projects/spring-data-elasticsearch
this.id = id;
this.name = name;
this.author = author;
}
....
}
3.定义Repository文件。假如只是需要基础功能,那么只需要继承Repository即可。要增加功能,只需要像官方文档中的示例按名称申明接口即可(并不需要去实现)。
// 基础功能
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
<S extends T> S index(S var1);
Iterable<T> search(QueryBuilder var1);
Page<T> search(QueryBuilder var1, Pageable var2);
Page<T> search(SearchQuery var1);
Page<T> searchSimilar(T var1, String[] var2, Pageable var3);
void refresh();
Class<T> getEntityClass();
}
// 自定义语句
public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}
4.操作存储一个数据。
@Autowired
TestRepository testRepository;
@Test
public void contextLoads() {
testRepository.index(new TestBean(1,"baozhou","zuozhe"));
}
2. ElasticsearchTemplate
暂时留空,以后用到回来填坑。
网友评论