【生意多】-免费发布分类信息
当前位置: 首页 » 新闻 » 教程 » 操作系统 » 正文

文件内容索引(索引搜索文件内容)

放大字体  缩小字体 发布日期:2022-06-30 17:07:45    浏览次数:6

【承接上文】
1、问:Lucene优点?
答:a、Lucene定义了一套以9字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
b、在传统倒排索引的基础上,实现了分块索引。
【ps:这里说明一下什么是倒排索引】
实际应用中需要根据属性值来查找记录,这种索引表中的每一项都包括一个属性值和对应的记录地址。由于是由属性值来确定记录位置,因而被称为倒排索引。
c、用户无需编写代码即可使用系统强大的查询能力,默认实现布尔、模糊、分组查询等。
d、虽然Lucene使用Java语言,但是开源之后就有许多大牛使得其能运行在各种各样的平台上。
2、问:能不能别整那些虚头巴脑的,整点代码不香吗?
答:香,好滴。以idea为例。
《1、idea搭建项目》看图:

《2、添加Lucene依赖》:

 <properties>    <java.version>1.8</java.version>    <lunece.version>4.10.2</lunece.version></properties><dependencies>    <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>        <exclusions>            <exclusion>                <groupId>org.junit.vintage</groupId>                <artifactId>junit-vintage-engine</artifactId>            </exclusion>        </exclusions>    </dependency>    <!-- lucene核心库 -->    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-core</artifactId>        <version>${lunece.version}</version>    </dependency>    <!-- Lucene的查询解析器 -->    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-queryparser</artifactId>        <version>${lunece.version}</version>    </dependency>    <!-- lucene的默认分词器库 -->    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-analyzers-common</artifactId>        <version>${lunece.version}</version>    </dependency>    <!-- lucene的高亮显示 -->    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-highlighter</artifactId>        <version>${lunece.version}</version>    </dependency></dependencies>

《3、实例代码》

package frozen;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.document;import org.apache.lucene.document.Field;import org.apache.lucene.document.StringField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;import org.junit.Test;import java.io.File;public class Frozen {        @Test        public void frozenLucene() throws Exception{                //1、创建文档对象                document document = new document();                                document.add(new StringField("id", "1", Field.Store.YES));                                document.add(new TextField("title", "爸妈省心、自己舒心,10万级热门家轿推荐!", Field.Store.YES));                //2 索引目录类,指定索引在硬盘中的位置                Directory directory = FSDirectory.open(new File("E:frozen"));                //3 创建分词器对象                Analyzer analyzer = new StandardAnalyzer();                //4 索引写出工具的配置对象                IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);                //5 创建索引的写出工具类。参数:索引的目录和配置信息                IndexWriter indexWriter = new IndexWriter(directory, conf);                //6 把文档交给IndexWriter                indexWriter.adddocument(document);                //7 提交                indexWriter.commit();                //8 关闭                indexWriter.close();                System.err.println("测试结束!!!");        }}


到这里,简单的一个Lucene文件索引就完成了
【你要查看索引可以利用工具,这里不做说明】
《4、IK分词器(重要)》
IK提供两种分词模式:智能模式和细粒度模式(智能:对应es的IK插件的ik_smart,细粒度:对应es的IK插件的ik_max_word)。
IK分词添加依赖

《5、查询Lucene索引》

        @Test        public void frozenSearch() throws Exception {                // 索引目录对象                Directory directory = FSDirectory.open(new File("E:frozen"));                // 索引读取工具                IndexReader reader = DirectoryReader.open(directory);                // 索引搜索工具                IndexSearcher searcher = new IndexSearcher(reader);                // 创建查询解析器,两个参数:默认要查询的字段的名称,分词器                QueryParser parser = new QueryParser("title", new IKAnalyzer());                // 创建查询对象                Query query = parser.parse("10万级");                // 搜索数据,两个参数:查询条件对象要查询的最大结果条数                // 返回的结果是 按照匹配度排名得分前N名的文档信息(包含查询到的总条数信息、所有符合条件的文档的编号信息)。                TopDocs topDocs = searcher.search(query, 10);                // 获取总条数                System.out.println("本次搜索共找到" + topDocs.totalHits + "条数据");                // 获取得分文档对象(ScoreDoc)数组.SocreDoc中包含:文档的编号、文档的得分                ScoreDoc[] scoreDocs = topDocs.scoreDocs;                for (ScoreDoc scoreDoc : scoreDocs) {                        // 取出文档编号                        int docID = scoreDoc.doc;                        // 根据编号去找文档                        document doc = reader.document(docID);                        System.out.println("id: " + doc.get("id"));                        System.out.println("title: " + doc.get("title"));                        System.out.println("匹配度: " + scoreDoc.score);                }        }

《6、Lucene核心API》
1、QueryParser(单一字段的查询解析器)
2、MultiFieldQueryParser(多字段的查询解析器)
3、IndexSearch可以帮助我们实现:快速搜索、排序、打分等功能
4、通过IndexSearcher对象,我们可以搜索,获取结果:TopDocs对象
在TopDocs中,包含两部分信息:int totalHits :查询到的总条数、ScoreDoc[] scoreDocs : 得分文档对象的数组
5、ScoreDoc是得分文档对象,包含两部分数据:int doc :文档的编号----lucene给文档的一个唯一编号;float score :文档的得分信息
拿到编号后,我们还需要根据编号来获取真正的文档信息
【还有,查询结果高亮显示:略!】

 
(文/小编)
打赏
免责声明
• 
本文为小编原创作品,作者: 小编。欢迎转载,转载请注明原文出处:https://www.31duo.com/news/show-3571864.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
 

(c)2016-2019 31DUO.COM All Rights Reserved浙ICP备19001410号-4

浙ICP备19001410号-4