elasticsearch首先人家是一个搜索引擎,性能很好。
springboot集成elasticsearch,maven引入pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<scope>runtime</scope>
</dependency>
application.properties
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
有两种方法,一种是基于spring data Repository,一种是ElasticsearchTemplate。
第一种demo:
定义Repository
package com.example.demo;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
@Document(indexName = "test1",type = "test2")
public class test implements Serializable {
@Field()
private int id;
@Field(searchAnalyzer = "ik_smart",analyzer = "ik_smart")
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "test{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@Field(searchAnalyzer = "ik_smart",analyzer = "ik_smart")这个是设置中文分词查询的
比如说,我输入查找的词为大家好,会拆成大,家,好去查询
test
package com.example.demo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
TestRepository testRepository;
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@Test
public void contextLoads() {
test t=new test();
t.setId(3);
t.setName("大鸡腿哦哦哦");
testRepository.save(t);
}
@Test
public void a(){
Iterable<test> iterable=testRepository.findAll();
for(test t:iterable){
System.out.println(t.getId()+" "+t.getName());
}
}
}
run,然后在浏览器输入http://localhost:9200/test1/_search
{"took":232,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":3,"max_score":1.0,"hits":[{"_index":"test1","_type":"test2","_id":"2","_score":1.0,"_source":{"id":2,"name":"大家好啊 123"}},{"_index":"test1","_type":"test2","_id":"1","_score":1.0,"_source":{"id":1,"name":"dajitui"}},{"_index":"test1","_type":"test2","_id":"3","_score":1.0,"_source":{"id":3,"name":"大鸡腿哦哦哦"}}]}}
期间插入很多个,方便测试
第二种demo:
package com.example.demo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
TestRepository testRepository;
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@Test
public void b(){
NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();
queryBuilder.withIndices("test1");
queryBuilder.withTypes("test2");
String keyword="大";
queryBuilder.withHighlightFields(new HighlightBuilder.Field("name").preTags("<font style='color:red;'>").postTags("</font>"));
queryBuilder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name",keyword)));
List<test> list=elasticsearchTemplate.query(queryBuilder.build(), new ResultsExtractor<List<test>>() {
@Override
public List<test> extract(SearchResponse searchResponse) {
List<test> list=new ArrayList<test>();
for(SearchHit hit:searchResponse.getHits()){
test t=new test();
t.setId(Integer.parseInt(hit.getId()));
t.setName(hit.getHighlightFields().get("name").fragments()[0].toString());
list.add(t);
}
return list;
}
});
for(test t:list){
System.out.println(t.toString());
}
}
}
执行结果:
test{id=2, name='<font style='color:red;'>大</font>家好啊 123'}
test{id=3, name='<font style='color:red;'>大</font>鸡腿哦哦哦'}
看到中文分词了吗,还有高亮
github:https://github.com/dajitui/springboot-elasticsearch
还有涉及到索引构造方式
可以使用mysql,或者mongodb的数据同步到elasticsearch,可以使用第三方工具
mysql:elasticsearch-jdbc
mongodb:mongo-connector