全文檢索
1.全文搜索概念:
(1)數(shù)據(jù)結(jié)構(gòu):
·結(jié)構(gòu)化:只具有固定格式或者有限長度的數(shù)據(jù),如數(shù)據(jù)庫即寡,元數(shù)據(jù)等
·非結(jié)構(gòu)化:指不定長或者無固定格式的數(shù)據(jù)徊哑,如郵件,word文檔等
(2)非結(jié)構(gòu)化數(shù)據(jù)的檢索:
·順序掃描法:適合小數(shù)據(jù)量文件?物聯(lián)網(wǎng)系統(tǒng)開發(fā)找上海捌躍網(wǎng)絡(luò)科技有限公司
·全文搜索:將非結(jié)構(gòu)化的數(shù)據(jù)轉(zhuǎn)為結(jié)構(gòu)化的數(shù)據(jù)聪富,然后創(chuàng)建索引莺丑,在進行搜索
(3)概念:全文搜索是一種將文件中所有文本域搜索項匹配的文件資料檢索方式
2.全文搜索實現(xiàn)原理
3.全文搜索實現(xiàn)技術(shù):基于java的開源實現(xiàn)Lucene,ElasticSearch(具有自身的分布式管理功能),Solr
4.ElasticSearch簡介:
概念:
(1)高度可擴展的開源全文搜索和分析引擎
(2)快速的,近實的多大數(shù)據(jù)進行存儲墩蔓,搜索和分析
(3)用來支撐有復(fù)雜的數(shù)據(jù)搜索需求的企業(yè)級應(yīng)用
特點及介紹:
(1)分布式
(2)高可用
(3)對類型梢莽,支持多種數(shù)據(jù)類型
(4)多API
(5)面向文檔
(6)異不寫入
(7)近實時:每隔n秒查詢,在寫入磁盤中
(8)基于Lucene
(9)Apache協(xié)議?
5.ElasticSearch與Spring Boot集成
(1)配置環(huán)境:ElasticSearch奸披,Spring Data ElasticSearch,JNA
(2)安裝ElasticSearch昏名,下載包,解壓直接啟動即可,這里特別說一下ElasticSearch的一些異常問題阵面,必須版本對應(yīng)轻局,其次端口問題一定要注意
(3)建立Spring Boot項目
(4)我們修改pom.xml文件洪鸭,將相關(guān)依賴加進去
(5)在項目代碼編寫之前我們必須在本地安裝ElasticSearch并在版本上與Spring Boot版本相兼容,其次注意端口號的問題仑扑,集成時ElasticSearch服務(wù)的端口號為9200览爵,而客戶端端口號為9300
接下來我們啟動本地安裝的ElasticSearch然后在啟動我們的項目:
<?xml version="1.0"encoding="UTF-8"?>4.0.0com.dhtt.spring.boot.blogspring.data.action0.0.1-SNAPSHOTjarspring.data.actionDemo project for Spring Bootorg.springframework.bootspring-boot-starter-parent2.1.0.RELEASE<!-- lookup parent from repository -->UTF-8UTF-81.8org.springframework.bootspring-boot-starter-data-jpa<!-- spring boot集成elasticsearch -->org.springframework.bootspring-boot-starter-data-elasticsearchorg.springframework.dataspring-data-elasticsearchorg.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web<!-- 添加熱部署 -->org.springframework.bootspring-boot-devtoolsorg.springframework.bootspring-boot-starter-testtest<!-- JNA 的依賴 -->net.java.dev.jnajna4.5.1org.elasticsearchelasticsearch<!-- 內(nèi)存數(shù)據(jù)庫h2 --><!-- <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId>
? ? ? ? ? ? </dependency> --><!-- MySql數(shù)據(jù)庫驅(qū)動 -->mysqlmysql-connector-java5.1.46<!-- hibernate持久層框架引入 -->org.hibernatehibernate-core5.3.7.Finalorg.springframework.bootspring-boot-maven-plugin
啟動項目進行測試,觀察項目各項配置是否正確镇饮,項目能否成功啟動蜓竹,項目啟動成功后
(5)接下來配置application.properties文件:
#thymeleaf配置spring.thymeleaf.encoding=UTF-8#熱部署靜態(tài)文件,不需要緩存,實時觀察文件修改效果spring.thymeleaf.cache=false#使用html5標(biāo)準(zhǔn)spring.thymeleaf.mode=HTML5spring.thymeleaf.suffix=.htmlspring.resources.chain.strategy.content.enabled=true#elasticsearch服務(wù)器地址spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300#連接超時時間spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s #節(jié)點名字储藐,默認elasticsearch#spring.data.elasticsearch.cluster-name=elasticsearch #spring.data.elasticsearch.repositories.enable=true#spring.data.elasticsearch.properties.path.logs=./elasticsearch/log#spring.data.elasticsearch.properties.path.data=./elasticsearch/data#數(shù)據(jù)庫連接配置spring.datasource.url=jdbc:mysql://localhost:3306/blog_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=falsespring.datasource.username=rootspring.datasource.password=qitao1996spring.datasource.driver-class-name=com.mysql.jdbc.Driver#jpa配置spring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=create-drop
(6)進行后臺編碼:
文檔類EsBlog:
packagecom.dhtt.spring.boot.blog.spring.data.action.entity;importjava.io.Serializable;importjavax.persistence.Id;importorg.springframework.data.elasticsearch.annotations.Document;/** * EsBlog實體(文檔)類 *? *@authorQiTao * */@Document(indexName="blog",type="blog")//指定文檔publicclassEsBlogimplementsSerializable{/**
? ? *
? ? */privatestaticfinallongserialVersionUID =4745983033416635193L;@IdprivateString id;privateString title;privateString summary;privateString content;protectedEsBlog(){super();? ? }publicEsBlog(String title, String summary, String content){super();this.title = title;this.summary = summary;this.content = content;? ? }publicStringgetId(){returnid;? ? }publicvoidsetId(String id){this.id = id;? ? }publicStringgetTitle(){returntitle;? ? }publicvoidsetTitle(String title){this.title = title;? ? }publicStringgetSummary(){returnsummary;? ? }publicvoidsetSummary(String summary){this.summary = summary;? ? }publicStringgetContent(){returncontent;? ? }publicvoidsetContent(String content){this.content = content;? ? }@OverridepublicStringtoString(){return"EsBlog [id="+ id +", title="+ title +", summary="+ summary +", content="+ content +"]";? ? }}
資源庫梅肤,定義數(shù)據(jù)查詢接口:
packagecom.dhtt.spring.boot.blog.spring.data.action.repository;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.data.elasticsearch.repository.ElasticsearchRepository;importcom.dhtt.spring.boot.blog.spring.data.action.entity.EsBlog;/** * EsBlogRepository接口 *? *@authorQiTao * */publicinterfaceEsBlogRepositoryextendsElasticsearchRepository{/**? ? * 分頁,查詢邑茄,去重? ? *? ? ? *@paramtitle? ? *@paramsummary? ? *@paramcontent? ? *@parampageable? ? *@return*/PagefindDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(String title, String summary,
? ? ? ? ? ? String content, PageRequest pageRequest);}
最后編寫Controller類:
packagecom.dhtt.spring.boot.blog.spring.data.action.web.user;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importcom.dhtt.spring.boot.blog.spring.data.action.entity.EsBlog;importcom.dhtt.spring.boot.blog.spring.data.action.repository.EsBlogRepository;@RestController@RequestMapping("/blogs")publicclassBlogController{@AutowiredprivateEsBlogRepository esBlogRepository;@GetMappingpublicListlist(@RequestParam(value ="title")String title,? ? ? ? ? ? @RequestParam(value ="summary")String summary,? ? ? ? ? ? @RequestParam(value ="content")String content,? ? ? ? ? ? @RequestParam(value ="pageIndex", defaultValue ="0")intpageIndex,? ? ? ? ? ? @RequestParam(value ="pageSize", defaultValue ="10")intpageSize){//添加測試數(shù)據(jù)esBlogRepository.deleteAll();? ? ? ? esBlogRepository.save(newEsBlog("登黃鶴樓","王之渙的等黃鶴樓","百日依山盡,黃河入海流俊啼,欲窮千里目肺缕,更上一層樓"));? ? ? ? esBlogRepository.save(newEsBlog("相思","王維的相思","紅豆生南國,春來發(fā)幾枝授帕,愿君多采截同木,此物最相思"));? ? ? ? esBlogRepository.save(newEsBlog("靜夜思","李白的靜夜思","床前明月光,疑是地上霜跛十,舉頭望明月彤路,低頭思故鄉(xiāng)"));//查詢獲取PageRequest pageRequest=PageRequest.of(pageIndex,pageSize);? ? ? ? Page page= esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(title, summary, content, pageRequest);returnpage.getContent();? ? }}
啟動項目,前臺進行訪問:
前臺結(jié)果打印成功芥映,故我們的Elasticsearch+Spring Boot集成成功
轉(zhuǎn)自:http://blog.51cto.com/13501268/2322430