分享

ElasticSearch搜索引擎的使用整合SpringMVC

 昵称13716297 2019-09-24

下载、安装、工具

下载并加压:ElasticSearch,来自 how2j

中文分词器:http:///frontdownload?bean.id=1696

执行安装分词器:(从github安装)

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip

从本地安装:

cd 安装路径

elasticsearch-plugin install zip路径/elasticsearch-analysis-ik-6.2.2.zip

工具:kibana

搭建

SpringMvc部分参照文章:ssm maven 工程目录以及环境搭建

pom包:

  1. <!--elasticsearch-rest-high-level-client -->
  2. <dependency>
  3. <groupId>org.elasticsearch.client</groupId>
  4. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  5. <version>6.3.2</version>
  6. </dependency>

工具类:

  1. public class ElasticUtils {
  2. // 相当于数据库名称(数据量小)
  3. public static String indexName = "shose";
  4. // 初始化api客户端
  5. public static RestHighLevelClient client = new RestHighLevelClient(
  6. RestClient.builder(
  7. new HttpHost("localhost", 9200, "http")
  8. ));
  9. // 关键字搜索 指定匹配类型
  10. public static List<Map<String, Object>> search(String type,String fieldName, String keyword, int start, int count) throws IOException {
  11. SearchRequest searchRequest = new SearchRequest(indexName);
  12. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  13. //关键字匹配对应字段
  14. MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder(fieldName, keyword);
  15. //模糊匹配
  16. matchQueryBuilder.fuzziness(Fuzziness.AUTO);
  17. sourceBuilder.query(matchQueryBuilder);
  18. //第几页
  19. sourceBuilder.from(start);
  20. //第几条
  21. sourceBuilder.size(count);
  22. searchRequest.source(sourceBuilder);
  23. searchRequest.types(type);
  24. //匹配度从高到低
  25. sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
  26. SearchResponse searchResponse = client.search(searchRequest);
  27. SearchHits hits = searchResponse.getHits();
  28. List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>();
  29. for (SearchHit hit : hits.getHits())
  30. {
  31. matchRsult.add(hit.getSourceAsMap());
  32. }
  33. return matchRsult;
  34. }
  35. //删除指定类型
  36. public static void deleteDocument(Object object) throws IOException {
  37. if(object instanceof Product){
  38. DeleteRequest deleteRequest = new DeleteRequest (indexName,"product", ((Product) object).getId());
  39. System.out.println("已经从ElasticSearch服务器上删除id="+((Product) object).getId()+"的product文档");
  40. client.delete(deleteRequest);
  41. }
  42. }
  43. // 获得指定type指定id的数据 json
  44. public static Map getDocument(String type,String id) throws IOException {
  45. // TODO Auto-generated method stub
  46. GetRequest request = new GetRequest(
  47. indexName,
  48. type,
  49. id);
  50. GetResponse response = client.get(request);
  51. if(!response.isExists()){
  52. System.out.println("检查到服务器上 "+type+" id="+id+ "的文档不存在");
  53. return null;
  54. }
  55. else{
  56. String source = response.getSourceAsString();
  57. System.out.print("获取到服务器上 "+type+" id="+id+ "的文档内容是:");
  58. System.out.println(source);
  59. return response.getSourceAsMap();
  60. }
  61. }
  62. // 插入指定type,数据
  63. public static void addDocument(Object object) throws IOException {
  64. Map<String, Object> jsonMap = new HashMap<>();
  65. if(object instanceof Product){
  66. jsonMap.put("id", ((Product)object).getId());
  67. jsonMap.put("name", ((Product)object).getName());
  68. jsonMap.put("price", ((Product)object).getPrice());
  69. jsonMap.put("detail", ((Product)object).getDetail());
  70. IndexRequest indexRequest = new IndexRequest(indexName, "product", ((Product)object).getId())
  71. .source(jsonMap);
  72. client.index(indexRequest);
  73. System.out.println("已经向ElasticSearch服务器增加Product:"+object);
  74. }
  75. }
  76. // 更新数据
  77. public static void updateDocument(Object object) throws IOException {
  78. if(object instanceof Product){
  79. UpdateRequest updateRequest = new UpdateRequest (indexName, "product", ((Product) object).getId())
  80. .doc("name",((Product) object).getId())
  81. .doc("price",((Product) object).getPrice())
  82. .doc("detail",((Product) object).getDetail());
  83. client.update(updateRequest);
  84. System.out.println("已经在ElasticSearch服务器修改产品为:"+object);
  85. }
  86. }
  87. private static boolean checkExistIndex(String indexName) throws IOException {
  88. boolean result =true;
  89. try {
  90. OpenIndexRequest openIndexRequest = new OpenIndexRequest(indexName);
  91. client.indices().open(openIndexRequest).isAcknowledged();
  92. } catch (ElasticsearchStatusException ex) {
  93. String m = "Elasticsearch exception [type=index_not_found_exception, reason=no such index]";
  94. if (m.equals(ex.getMessage())) {
  95. result = false;
  96. }
  97. }
  98. if(result)
  99. System.out.println("索引:" +indexName + " 是存在的");
  100. else
  101. System.out.println("索引:" +indexName + " 不存在");
  102. return result;
  103. }
  104. private static void deleteIndex(String indexName) throws IOException {
  105. DeleteIndexRequest request = new DeleteIndexRequest(indexName);
  106. client.indices().delete(request);
  107. System.out.println("删除了索引:"+indexName);
  108. }
  109. private static void createIndex(String indexName) throws IOException {
  110. // TODO Auto-generated method stub
  111. CreateIndexRequest request = new CreateIndexRequest(indexName);
  112. client.indices().create(request);
  113. System.out.println("创建了索引:"+indexName);
  114. }
  115. // 批量插入
  116. // private static void batchInsert(List<Product> products) throws IOException {
  117. // // TODO Auto-generated method stub
  118. // BulkRequest request = new BulkRequest();
  119. //
  120. // for (Product product : products) {
  121. // Map<String,Object> m = product.toMap();
  122. // IndexRequest indexRequest= new IndexRequest(indexName, "product", String.valueOf(product.getId())).source(m);
  123. // request.add(indexRequest);
  124. // }
  125. //
  126. // client.bulk(request);
  127. // System.out.println("批量插入完成");
  128. // }
  129. public static String getIndexName() {
  130. return indexName;
  131. }
  132. public static void setIndexName(String indexName) {
  133. ElasticUtils.indexName = indexName;
  134. }
  135. public static RestHighLevelClient getClient() {
  136. return client;
  137. }
  138. public static void setClient(RestHighLevelClient client) {
  139. ElasticUtils.client = client;
  140. }
  141. }

实体类:

Controller:

  1. @Controller
  2. public class ElasticController {
  3. @Autowired
  4. private ElasticService elasticService;
  5. @RequestMapping(value = "product",method = RequestMethod.POST)
  6. @ResponseBody
  7. public Message addProduct(
  8. @RequestParam(name = "id")String id,
  9. @RequestParam(name = "name")String name,
  10. @RequestParam(name = "price")String price,
  11. @RequestParam(name = "detail")String detail){
  12. return elasticService.addProduct(new Product(id,name,price,detail));
  13. }
  14. @RequestMapping(value = "product",method = RequestMethod.DELETE)
  15. @ResponseBody
  16. public Message delProduct(
  17. @RequestParam(name = "id")String id){
  18. return elasticService.delProduct(id);
  19. }
  20. @RequestMapping(value = "product",method = RequestMethod.PUT)
  21. @ResponseBody
  22. public Message updateProduct(
  23. @RequestParam(name = "id")String id,
  24. @RequestParam(name = "name")String name,
  25. @RequestParam(name = "price")String price,
  26. @RequestParam(name = "detail")String detail){
  27. return elasticService.updateProduct(new Product(id,name,price,detail));
  28. }
  29. @RequestMapping(value = "product",method = RequestMethod.GET)
  30. @ResponseBody
  31. public Message searchProduct(
  32. @RequestParam(name = "fieldName",required = false)String fieldName,
  33. @RequestParam(name = "name",required = false)String name,
  34. @RequestParam(name = "start",required = false)Integer start,
  35. @RequestParam(name = "count",required = false)Integer count,
  36. @RequestParam(name = "id",required = false)String id){
  37. if(id != null){
  38. return elasticService.getProduct(id);
  39. }else {
  40. return elasticService.searchProduct(fieldName,name,start,count);
  41. }
  42. }
  43. }

Service

  1. @Service
  2. public class ElasticServiceImpl implements ElasticService {
  3. @Override
  4. public Message addProduct(Product product) {
  5. try {
  6. ElasticUtils.addDocument(product);
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. return new Message("500",null);
  10. }
  11. return new Message("200",null);
  12. }
  13. @Override
  14. public Message delProduct(String id) {
  15. Product product = new Product();
  16. product.setId(id);
  17. try {
  18. ElasticUtils.deleteDocument(product);
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. return new Message("500",null);
  22. }
  23. return new Message("200",null);
  24. }
  25. @Override
  26. public Message getProduct(String id) {
  27. try {
  28. return new Message("200",ElasticUtils.getDocument("product",id));
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. return new Message("500",null);
  32. }
  33. }
  34. @Override
  35. public Message searchProduct(String fieldName,String keyword,int start,int count) {
  36. try {
  37. return new Message("200",ElasticUtils.search("product",fieldName,keyword,start,count));
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. return new Message("500",null);
  41. }
  42. }
  43. @Override
  44. public Message updateProduct(Product product) {
  45. try {
  46. ElasticUtils.updateDocument(product);
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. return new Message("500",null);
  50. }
  51. return new Message("200",null);
  52. }
  53. }

测试

添加一个product:成功

通过id查询product类型的数据:成功

模糊搜索数据:

删除数据:

再次查询:没有匹配数据

 更多功能有待测试 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多