oyhk 学习笔记
上一篇文章,说到了先利用jest junit构架一个ES的搜索入门例子...现在准备要做一个ES的WEB架构例子,希望大家都学习学习ES分布式搜索引擎,真的非常不错的...欢迎大家一起讨论讨论...
做成WEB的架构,当然我不用servlet了...直接使用spring springmvc去做吧...也当是一个ES跟spring springmvc 集成的例子,为了简单起见,我这里不用freemarker了..我直接使用jsp做视图...我也用了bootstrap去管理一个web页面,这样可以省很多时间...
当然我也是用maven了...如果不有熟悉maven的朋友们,可以跟我交流下,大家学习学习...
提示:项目可以用mvn jetty:run 就可以跑起来了...
代码可能有点长,想学习的童鞋们认真些了...
首先我们看看web界面
首页:
点击:创建索引
创建索引成功..
搜索:
搜索结果:
好了,下面开始真正的代码....
1.看看项目的目录结构:
我就贴重要的几个文件代码出来,源代码已经有了,大家可以下载
下面pom.xml代码
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mkfree</groupId> <artifactId>soso</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>java-jest-sample</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>3.1.2.RELEASE</spring.version> <slf4j.version>1.5.10</slf4j.version> <slf4j-log4j12.version>1.6.1</slf4j-log4j12.version> <java.version>1.6</java.version> <junit.version>4.8.2</junit.version> <org.aspectj-version>1.6.9</org.aspectj-version> </properties> <repositories> <repository> <id>sonatype</id> <name>Sonatype Groups</name> <url>https://oss.sonatype.org/content/groups/public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>0.0.2</version> </dependency> <!-- ES dependency for query builder --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>0.19.11</version> </dependency> <!-- Spring Dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>test</scope> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- View Dependencies --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- Test Dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j-log4j12.version}</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> </dependencies> <pluginRepositories> <pluginRepository> <id>cloudbees-public-release</id> <url>http://repository-cloudbees.forge.cloudbees.com/public-release</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <build> <finalName>java-jest-sample</finalName> <plugins> <!-- Plugin to run and test through maven --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.10</version> <configuration> <stopPort>9966</stopPort> <stopKey>foo</stopKey> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-runner</artifactId> <version>7.5.4.v20111024</version> <destFileName>jetty-runner.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <!-- Ensures we are compiling at 1.6 level --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>com.cloudbees</groupId> <artifactId>bees-maven-plugin</artifactId> <version>1.3.2</version> </plugin> </plugins> <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes/</outputDirectory> </build> </project>
SearchController 类
package com.mkfree.soso.action; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import com.mkfree.soso.model.News; import com.mkfree.soso.service.SearchService; /** * 搜索控制 * * @author hk * * 2013-1-16 下午8:26:09 */ @Controller @RequestMapping("/") public class SearchController { @Autowired SearchService searchService; @RequestMapping(method = RequestMethod.GET) public ModelAndView home() { ModelAndView mv = new ModelAndView(); mv.setViewName("home"); return mv; } @RequestMapping(method = RequestMethod.GET, value = "/search") public ModelAndView search(@RequestParam("q") String query) { Listarticles = searchService.searchsNews(query); ModelAndView mv = new ModelAndView(); mv.setViewName("search"); mv.addObject("articles", articles); return mv; } @RequestMapping(method = RequestMethod.GET, value = "/search/create") public ModelAndView createInitialData() { searchService.builderSearchIndex(); ModelAndView mv = new ModelAndView("forward:/"); mv.addObject("message", "文章索引已创建成功!"); return mv; } @RequestMapping(method = RequestMethod.GET, value = "/about") public ModelAndView about() { ModelAndView mv = new ModelAndView(); mv.setViewName("about"); return mv; } }
配置客户端 SpringConfiguration 类
package com.mkfree.soso.configur; import io.searchbox.client.JestClient; import io.searchbox.client.JestClientFactory; import io.searchbox.client.config.ClientConfig; import io.searchbox.client.config.ClientConstants; import java.util.LinkedHashSet; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author hk * * 2013-1-16 下午8:49:51 */ @Configuration public class SpringConfiguration { public @Bean ClientConfig clientConfig() { String connectionUrl = "http://192.168.56.101:9200"; ClientConfig clientConfig = new ClientConfig(); LinkedHashSetservers = new LinkedHashSet(); servers.add(connectionUrl); clientConfig.getServerProperties().put(ClientConstants.SERVER_LIST, servers); clientConfig.getClientFeatures().put(ClientConstants.IS_MULTI_THREADED, false); return clientConfig; } public @Bean JestClient jestClient() { JestClientFactory factory = new JestClientFactory(); factory.setClientConfig(clientConfig()); return factory.getObject(); } }
实体类
package com.mkfree.soso.model; import io.searchbox.annotations.JestId; /** * 虚拟news 搜索文章 * * @author hk * * 2013-1-12 下午11:38:29 */ public class News { @JestId private int id; private String title; private String content; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
搜索服务类
package com.mkfree.soso.service; import io.searchbox.client.JestClient; import io.searchbox.client.JestResult; import io.searchbox.core.Bulk; import io.searchbox.core.Index; import io.searchbox.core.Search; import io.searchbox.indices.CreateIndex; import io.searchbox.indices.DeleteIndex; import java.io.IOException; import java.util.List; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.mkfree.soso.model.News; /** * es简单服务接口 * * @author hk * * 2013-1-12 下午11:47:16 */ @Service public class SearchService { @Autowired private JestClient jestClient; int num = 100000; /** * 创建es news索引 */ public void builderSearchIndex() { long start = System.currentTimeMillis(); try { // 如果索引存在,删除索引 DeleteIndex deleteIndex = new DeleteIndex("news"); jestClient.execute(deleteIndex); // 创建索引 CreateIndex createIndex = new CreateIndex("news"); jestClient.execute(createIndex); // Bulk 两个参数1:索引名称2:类型名称(用文章(article)做类型名称) Bulk bulk = new Bulk("news", "article"); // 添加添加100万条假数据去服务端(ES) for (int i = 0; i < num; i++) { News news = new News(); news.setId(i + 1); news.setTitle("elasticsearch结合spring springmvc jest 使用做成WEB架构" + (i + 1)); news.setContent("oyhk 学习笔记 上一篇文章,说到了先利用jest junit构架一个ES的搜索入门例子...现在准备要做一个ES的WEB架构例子,希望大家都学习学习ES分布式搜索引擎,真的非常不错的...欢迎大家一起讨论讨论... 做成WEB的架构,当然我不用servlet了...直接使用spring springmvc去做吧...也当是一个ES跟spring springmvc 集成的例子,为了简单起见,我这里不用freemarker了..我直接使用jsp做视图... 当然我也是用maven了...如果不有熟悉maven的朋友们,可以跟我交流下,大家学习学习..." + (i + 1)); bulk.addIndex(new Index.Builder(news).build()); } jestClient.execute(bulk); } catch (Exception e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("创建索引时间:数据量是 " + num + "记录,共用时间 -->> " + (end - start) + " 毫秒"); } /** * 搜索新闻 * * @param param * @return */ public ListsearchsNews(String param) { try { long start = System.currentTimeMillis(); QueryBuilder queryBuilder = QueryBuilders.queryString(param); Search search = new Search(Search.createQueryWithBuilder(queryBuilder.toString())); search.addIndex("news"); search.addType("article"); JestResult result = jestClient.execute(search); long end = System.currentTimeMillis(); System.out.println("在" + num + "条记录中,搜索新闻,共用时间 -->> " + (end - start) + " 毫秒"); return result.getSourceAsObjectList(News.class); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } }
其他的...jsp文件我就不贴出代码了....
这博客希望对大家有用...进一步对ES研究....
后着会写更多的关于搜索方面的博客...把学习过程都记录下来..
源代码下载:http://blog.mkfree.com/posts/40
本文章来自:http://blog.mkfree.com/posts/40
相关推荐
简单整合,不是spring-data,无api操作示例
spring-data-jest, Jest的Spring Data 实现 Spring Data Jest 基于on客户端的ElasticSearch的Spring Data 实现仅在 HTTP ( 例如AWS上) 可以访问的情况下使用 Spring Data 和ElasticSearch群集。
spring spingmvc 集成elasticSearch 5.5.x版本 ,基本的增删改查.完成
Elasticsearch之Java客户端Jest的全部依赖jar包,亲测有效。
Spring Boot结合Jest实现对ElasticSearch的全文检索,分词检索,分页,搜索结果高亮关键词,多字段检索 PageController中的搜索方法里面是全套的,分词,分页,高亮等都包含,数据格式个es-head中创建索引的索引在...
本文件包含了es的两个版本2.4.0和6.2.4实例中用的是2版本需要spring4或以上,文件中有SpringMVC+Spring+Hiberante+JPA+ESeacher的所有jar包和xml文件配置,还有业务代码的说明使用(dao\service\),还包含了ik分词...
本示例程序主要是spring 整合elasticsearch-2.3.5的实践,测试时先将配置文件es.properties中ES服务端es.ip,es.port, es.cluster 配置替换成自己的服务器信息
资源为http://blog.csdn.net/qq_25800733/article/details/78752080的附件
spring-data-elasticsearch中文使用文档,spring-data-elasticsearch、elasticsearch、ES、ElasticSearch、ES中文教程
Elasticsearch+spring
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布...架构图方便理解Elasticsearch
解决spring-data-elasticsearch 5.4.0 不支持 5.4.1的elasticsearch问题
elasticsearch spring 集成,用到maven elasticsearch服务下载包括其中插件和分词,可以简单参考下
Spring Data Elasticsearch API(Spring Data Elasticsearch 开发文档).CHM。 官网 Spring Data Elasticsearch API
spring+springMVC全量jar包,大部分都是最新的5.X.X版本的
做的一个elasticsearch搜索引擎列子,包括索引,映射等的管理和索引文档的增删改查等
elasticsearch_springdata整合用例,包含坐标,案例,实体类等
一般来说我们开发Elasticsearch会选择使用集成springboot,在网上找的springboot集成elasticsearch文章几乎都是extends ElasticsearchRepository的方式来实现。但是新版本ElasticsearchRepository里的方法基本上已经...
spring-data-elasticsearch默认依赖的客户端对新版本支持不够友好。 目前比较好的使用方式,还是使用原生的客户端,这样不但灵活,也易于 学习,但spring官方并未提供其相应的boot starter实现,这就是此项目 的由来...