引言:搜索即检索 如网页搜索,关系数据库查询其实也是一个搜索。那么这些搜索和全文搜索ElasticSearch有什么关系呢
1.全文搜索
(1)数据结构:
我们以往学习的是数据库查询是结构化搜索,非结构化数据的搜索:
顺序扫描法我们在windows系统中搜索文件时候,用的就是这种方法,适合小数据量文件。
当数据量大时,就要采取全文搜索。
全文搜索是一种将文件中所有文本与搜索项匹配的搜索方法。
非结构化数据转化为结构化数据去搜索。
(2)全文搜索的原理:
建立索引的策略各有不同,一般结果用分页形式返回,将相关度高的排到前面,有些甚至将广告商的排在前面。
(3)全文搜索实现技术
基于Java的开源实现
Lucene是一种全文搜索引擎,ES本身也是Lucene的实现,Solr和ES一样全文搜索系统。ES自己有一套自带的分布式管理功能。Solr支持较多的数据格式,而ES只支持Json,ES提供的功能较少较核心,实时搜索效果更好,目前ES更受欢迎。
2. ElasticSearch
(1)ES特点
(2)ES核心概念
3 ES与Spring Boot集成
(1)环境
按照网上教程安装对应版本的ES
(2) 修改build.gradle
添加相应的依赖
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
compile group: 'net.java.dev.jna', name: 'jna', version: '4.3.0'
compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '2.1.3.RELEASE'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
(3)修改application.properties
#服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#设置连接超时时间
spring.data.elasticsearch.transport.tcp.connect_timeout=120
(4)后台编码
EsBlog.class
@Document(indexName = "blog",type = "blog") //文档
public class EsBlog implements Serializable {
private static final long serialVersionUID = 1L;
@Id //
private String id;
private String title;
private String summary;
private String content;
protected EsBlog(){} //JPA构造要求 防止直接使用
public EsBlog(String title, String summary, String content) {
this.title = title;
this.summary = summary;
this.content = content;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return String.format("EsBlog[id='%s',title='%s',summary='%s',content='%s']",
id,title,summary,content);
}
}
EsBlogRepository.java 继承ES的接口,这里要注意的是传入的参数需要有一个pageable,函数命名采用JPA中的命名
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog,String> {
/**
* 分页查询博客 (去重)
* JPA不用自己写SQL
* @param title
* @param content
* @param summary
* @return
*/
Page<EsBlog> findDistinctByTitleContainingOrContentContainingOrSummaryContaining(String title, String content,String summary,Pageable pageable);
}
编写控制器BlogControl.java
@RestController
@RequestMapping("/blogs")
public class BlogControl {
@Autowired
private EsBlogRepository esBlogRepository;
@Before //在执行test前会执行
public void initRepositoryDate(){
//清除所有数据
esBlogRepository.deleteAll();
esBlogRepository.save(new EsBlog("登鹳雀楼","白日依山尽","白日依山尽,黄河入海流。\n" +
"欲穷千里目,更上一层楼。"));
esBlogRepository.save(new EsBlog("问刘十九","绿蚁新醅酒","绿蚁新醅酒,红泥小火炉。\n" +
"晚来天欲雪,能饮一杯无?"));
esBlogRepository.save(new EsBlog("寻隐者不遇","松下问童子","松下问童子,言师采药去。\n" +
"只在此山中,云深不知处。"));
}
@GetMapping
public List<EsBlog> list(@RequestParam(value = "title") String title, @RequestParam(value = "summary") String summary,
@RequestParam(value = "content") String content,
@RequestParam(value = "pageIndex",defaultValue = "0") int pageIndex,
@RequestParam(value = "pageSize",defaultValue = "10") int pageSize){
Pageable pageable =new PageRequest(pageIndex,pageSize);
Page<EsBlog> page = esBlogRepository.findDistinctByTitleContainingOrContentContainingOrSummaryContaining(title,content,summary,pageable);
return page.getContent();
}
}
(5)启动Elasticsearch.bat
(6)运行程序;
然后在浏览器中测试,测试通过