?文章來源:http://www.zghlxwxcb.cn/news/detail-524554.html
?Lucene功能
? ? ? ? 1.可擴(kuò)展的高性能索引
????????2.強(qiáng)大、準(zhǔn)確、高效的搜索算法
????????3.跨平臺解決方案?
?適用場景
? ? 在應(yīng)用中為數(shù)據(jù)庫中的數(shù)據(jù)提供全文檢索實現(xiàn)。
?? ?開發(fā)獨立的搜索引擎服務(wù)、系統(tǒng)。
?? ?對于數(shù)據(jù)量大、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索。
?? ?任意? ? ? ? ? ? 結(jié)構(gòu)化搜索
?? ??????????????????? ?全文搜索
?? ??????????????????? ?分面
?? ??????????????????? ?跨高維向量的最近鄰搜索
?? ??????????????????? ?拼寫糾正或查詢建議的應(yīng)用程序架構(gòu)
????????結(jié)構(gòu)化數(shù)據(jù)搜索與非結(jié)構(gòu)化數(shù)據(jù)搜索對比分析
?
?
?
? ? ? ? 1.需要的pom文件
?
<dependencies> <!-- Web依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL驅(qū)動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Mybatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <!-- 引入Lucene核心包及分詞器包 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.10.3</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>4.10.3</version> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- Lombok工具 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- IK中文分詞器 --> <dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
? ? ? ? 2.核心配置文件
#訪問的端口 server.port=9000 spring.application.name=lunce spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/es_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=0216 # 開啟駝峰命名匹配映射 mybatis-plus.configuration.map-underscore-to-camel-case=true
? ? ? ? 3.job_info表對應(yīng)的實體類
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor @TableName("job_info") public class JobInfo { @TableId(type = IdType.AUTO) private Long id; // id屬性建議使用包裝類定義 private String companyName; private String companyAddr; private String companyInfo; private String jobName; private String jobAddr; private String jobInfo; private int salaryMin; private int salaryMax; private String url; private String time; }
? ? ? ? ? 4.mapper層
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lucene.demo.dommain.JobInfo; public interface JobInfoMapper extends BaseMapper<JobInfo> { }
? ? ? ? 5.service層
? ? ? ? 接口
import com.lucene.demo.dommain.JobInfo; import java.util.List; public interface JobInfoService { JobInfo selectById(Long id); List<JobInfo> selectAll(); }
????????實現(xiàn)類
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.lucene.demo.dommain.JobInfo; import com.lucene.demo.mapper.JobInfoMapper; import com.lucene.demo.service.JobInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class JobInfoServiceImpl implements JobInfoService { @Autowired private JobInfoMapper jobInfoMapper; @Override public JobInfo selectById(Long id) { return jobInfoMapper.selectById(id); } @Override public List<JobInfo> selectAll() { List<JobInfo> ji = jobInfoMapper.selectList(new QueryWrapper<>()); return ji; } }
? ? ? ? 到這里我們的準(zhǔn)備工作就算完成了,然后開始給大文件的數(shù)據(jù)創(chuàng)建索引
@Test public void createIndex() throws IOException {//數(shù)據(jù)中查詢數(shù)據(jù),給其建立索引 //1.指定索引文件存儲位置 Directory directory = FSDirectory.open(new File("D:\\1javaweb\\index")); //2.配置分詞器,版本信息 // Analyzer analyzer =new StandardAnalyzer();//Lucene提供的標(biāo)準(zhǔn)分詞器 Analyzer analyzer =new IKAnalyzer();//IK分詞器 //指定版本 Version.LATEST最新版本 IndexWriterConfig config =new IndexWriterConfig(Version.LATEST,analyzer); //3.創(chuàng)建一個用來寫入索引的數(shù)據(jù)的對象IndexWriter // 1). 索引寫入目標(biāo)文件的位置 2).按照哪一個標(biāo)準(zhǔn)分詞器寫出數(shù)據(jù) IndexWriter writer = new IndexWriter(directory,config); // 刪除指定目錄下的所有索引數(shù)據(jù) writer.deleteAll(); //4.從Mysql數(shù)據(jù)庫中查詢的數(shù)據(jù)交給Lucene寫入到index目錄下并創(chuàng)建索引 List<JobInfo> jobInfos = jobInfoService.selectAll(); //5.循環(huán)遍歷集合 for (JobInfo jobInfo:jobInfos) { //創(chuàng)建文檔對象 :Document是用來存儲數(shù)據(jù)庫中的一條記錄 Document d =new Document(); //document中添加field(數(shù)據(jù)庫字段信息):數(shù)據(jù)類型,取值 YES永久存儲 NO只用一次 d.add(new LongField("id",jobInfo.getId(), Field.Store.YES)); d.add(new TextField("companyName",jobInfo.getCompanyName(), Field.Store.YES)); d.add(new TextField("companyAddr",jobInfo.getCompanyAddr(), Field.Store.YES)); d.add(new IntField("salaryMax",jobInfo.getSalaryMax(), Field.Store.YES)); d.add(new IntField("salaryMin",jobInfo.getSalaryMin(), Field.Store.YES)); d.add(new StringField("url",jobInfo.getUrl(), Field.Store.YES)); d.add(new StringField("time",jobInfo.getTime(), Field.Store.YES)); //將當(dāng)前的document文檔寫入到 writer.addDocument(d); } //關(guān)閉資源 writer.close(); }
? ? ? ? 通過索引進(jìn)行搜索,更加快速簡便
//查詢索引 @Test public void queryIndex() throws IOException { //1.指定索引文件存儲位置 Directory directory = FSDirectory.open(new File("D:\\1javaweb\\index")); //2.創(chuàng)建一個讀取索引.文件數(shù)據(jù)的對象 IndexReader ir = DirectoryReader.open(directory); //3.創(chuàng)建一個用來搜索索引中數(shù)據(jù)的對象 IndexSearcher is =new IndexSearcher(ir); // 使?term查詢:指定查詢的域名和關(guān)鍵字 Query query = new TermQuery(new Term("companyName","京")); TopDocs search = is.search(query, 100); System.out.println("查詢到的總數(shù):"+search.totalHits); System.out.println("maxScore:"+search.getMaxScore()); ScoreDoc[] scoreDocs = search.scoreDocs; //遍歷文檔的數(shù)據(jù) for (ScoreDoc scoreDoc : scoreDocs) { //獲取id int docId = scoreDoc.doc; //根據(jù)id獲取文檔的對象 Document doc = is.doc(docId); System.out.println("id:"+doc.get("id")); System.out.println("companyName:"+doc.get("companyName")); System.out.println("companyAddr:"+doc.get("companyAddr")); System.out.println("slaryMax:"+doc.get("slaryMax")); System.out.println("slaryMin:"+doc.get("slaryMin")); System.out.println("url:"+doc.get("url")); System.out.println("================"); } }
?
?對索引的解析?
????????Index索引:在Lucene中一個索引是存放在一個文件夾中的
????????Segment段:按層次保存了索引到詞的包含關(guān)系:索引(Index) => 段(segment) => 文檔(Document) => 域(Field) => 詞(Term)
?? ??? ?????????????????即此索引包含了哪些段,每個段包含了哪些文檔,每個文檔包含了哪些域,每個域包含了哪些詞。
?? ??? ?????????????????一個索引可以包含多個段,段與段之間是獨立的,添加新文檔可以生成新的段,不同的段可以合并。
?? ??????????? ?????????如上圖中,具有相同前綴前件的屬同同個段,圖中共三個段?
? ? ? ? ? ? ? ? ? ? ???segments_8和segments.gen是段的元數(shù)據(jù)文件,也即它們保存了段的屬性信息
????????Field的特性:? ? 是否分詞(tokenized)???????? 拆分輸入的關(guān)鍵詞
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是否索引(indexed)? ? ? ? ???用戶查詢條件的詞作為索引
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是否存儲(stored)? ? ? ? ? ? ?將Field值保存在Document中
?????????Field類????????? ?LongField:數(shù)值型代表???????? ?TextField:文本類型???????? ?IntField:數(shù)字類型?????????StringField:字符串文章來源地址http://www.zghlxwxcb.cn/news/detail-524554.html
到了這里,關(guān)于在數(shù)據(jù)量很大的時候使用的lunce的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!