Elastic Search搜索引擎在SpringBoot中的實踐

Spring工程創建

這部分沒有特殊要交代的,但有幾個注意點一定要當心

  • 注意在新建項目時記得勾選web和NoSQL中的Elasticsearch依賴,來張圖說明一下吧:
Elastic Search搜索引擎在SpringBoot中的實踐

項目自動生成以後pom.xml中會自動添加spring-boot-starter-data-elasticsearch的依賴:

		<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-elasticsearch/<artifactid>
/<dependency>
  • 本項目中我們使用開源的基於restful的es java客戶端jest,所以還需要在pom.xml中添加jest依賴:
		<dependency>
<groupid>io.searchbox/<groupid>
<artifactid>jest/<artifactid>
/<dependency>
  • 除此之外還必須添加jna的依賴:
		<dependency>
<groupid>net.java.dev.jna/<groupid>
<artifactid>jna/<artifactid>
/<dependency>

否則啟動spring項目的時候會報JNA not found. native methods will be disabled.的錯誤:

Elastic Search搜索引擎在SpringBoot中的實踐

  • 項目的配置文件application.yml中需要把es服務器地址配置對
server:
port: 6325
spring:
elasticsearch:
jest:
uris:
- http://113.209.119.170:9200 # ES服務器的地址!
read-timeout: 5000

代碼結構:

Elastic Search搜索引擎在SpringBoot中的實踐

各部分代碼詳解如下,註釋都有:

  • Entity.java
public class Entity implements Serializable{
private static final long serialVersionUID = -763638353551774166L;
public static final String INDEX_NAME = "index_entity";
public static final String TYPE = "tstype";
private Long id;
private String name;
public Entity() {
super();
}
public Entity(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
  • TestService.java
import java.util.List;
public interface TestService {
void saveEntity(Entity entity);
void saveEntity(List<entity> entityList);
List<entity> searchEntity(String searchContent);
}
/<entity>/<entity>
  • TestServiceImpl.java
@Service
public class TestServiceImpl implements TestService {
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class);
@Autowired
private JestClient jestClient;
@Override
public void saveEntity(Entity entity) {
Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build();
try {
jestClient.execute(index);
LOGGER.info("ES 插入完成");
} catch (IOException e) {
e.printStackTrace();
LOGGER.error(e.getMessage());
}
}
/**
* 批量保存內容到ES
*/
@Override
public void saveEntity(List<entity> entityList) {
Bulk.Builder bulk = new Bulk.Builder();
for(Entity entity : entityList) {
Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build();
bulk.addAction(index);
}
try {
jestClient.execute(bulk.build());
LOGGER.info("ES 插入完成");
} catch (IOException e) {
e.printStackTrace();
LOGGER.error(e.getMessage());
}
}
/**
* 在ES中搜索內容
*/
@Override
public List<entity> searchEntity(String searchContent){
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//searchSourceBuilder.query(QueryBuilders.queryStringQuery(searchContent));
//searchSourceBuilder.field("name");
searchSourceBuilder.query(QueryBuilders.matchQuery("name",searchContent));
Search search = new Search.Builder(searchSourceBuilder.toString())
.addIndex(Entity.INDEX_NAME).addType(Entity.TYPE).build();
try {
JestResult result = jestClient.execute(search);

return result.getSourceAsObjectList(Entity.class);
} catch (IOException e) {
LOGGER.error(e.getMessage());
e.printStackTrace();
}
return null;
}
}
/<entity>/<entity>
  • EntityController.java
@RestController
@RequestMapping("/entityController")
public class EntityController {
@Autowired
TestService cityESService;
@RequestMapping(value="/save", method=RequestMethod.GET)
public String save(long id, String name) {
System.out.println("save 接口");
if(id>0 && StringUtils.isNotEmpty(name)) {
Entity newEntity = new Entity(id,name);
List<entity> addList = new ArrayList<entity>();
addList.add(newEntity);
cityESService.saveEntity(addList);
return "OK";
}else {
return "Bad input value";
}
}
@RequestMapping(value="/search", method=RequestMethod.GET)
public List<entity> save(String name) {
List<entity> entityList = null;
if(StringUtils.isNotEmpty(name)) {
entityList = cityESService.searchEntity(name);
}
return entityList;
}
}
/<entity>/<entity>/<entity>/<entity>

實際實驗

增加幾條數據,可以使用postman工具,也可以直接在瀏覽器中輸入,如增加以下5條數據:

http://localhost:6325/entityController/save?id=1&name=南京中山陵
http://localhost:6325/entityController/save?id=2&name=中國南京師範大學
http://localhost:6325/entityController/save?id=3&name=南京夫子廟
http://localhost:6325/entityController/save?id=4&name=杭州也非常不錯
http://localhost:6325/entityController/save?id=5&name=中國南邊好像沒有叫帶京字的城市了

數據插入效果如下(使用可視化插件elasticsearch-head觀看):

Elastic Search搜索引擎在SpringBoot中的實踐

我們來做一下搜索的測試:例如我要搜索關鍵字“南京” 我們在瀏覽器中輸入:

http://localhost:6325/entityController/search?name=南京

搜索結果如下:

Elastic Search搜索引擎在SpringBoot中的實踐

當然這裡用的是standard分詞方式,將每個中文都作為了一個term,凡是包含“南”、“京”關鍵字的記錄都被搜索了出來,只是評分不同而已,當然還有其他的一些分詞方式,此時需要其他分詞插件的支持,此處暫不涉及。

喜歡的小夥伴,點個關注吧,每天分享新的內容!


分享到:


相關文章: