企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 简介 默认使用的是标准分析器StandardAnalyzer 查询分析器效果 使用Analyzer对象的tokenStream方法返回一个TokenStream对象.词对象中包含了最终分词结果. 实现步骤 1. 创建一个Analyzer对象,StandardAnalyzer对象 2. 使用分析器对象的tokenStream方法获得一个TokenStream对象 3. 向TokenStream对象中设置一个引用,相当于一个指针 4. 调用while循环遍历TokenStream对象 5. 关闭TokenStream对象 # 标准分析器StandardAnalyzer ~~~ @Test public void testTokenStream() throws IOException { //1. 创建一个Analyzer对象,StandardAnalyzer对象 StandardAnalyzer analyzer = new StandardAnalyzer(); //2. 使用分析器对象的tokenStream方法获得一个TokenStream对象, 域名称,分析的文本内容 TokenStream tokenStream = analyzer.tokenStream("", "数据库like查询和全文检索的区别"); //3. 向TokenStream对象中设置一个引用,相当于一个指针 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //4. 调用TokenStream对象的rest方法.如果不调用抛异常 tokenStream.reset(); //5. 调用while循环遍历TokenStream对象 while (tokenStream.incrementToken()) { System.out.println(charTermAttribute.toString()); } //6. 关闭TokenStream对象 tokenStream.close(); /** * 输出 * 数 * 据 * 库 * like * 查 * 询 * 和 * 全 * 文 * 检 * 索 * 的 * 区 * 别 */ } ~~~ # ik中文分词 IKAnalyze的使用方法 1. 把IKAnalyzer的jar包添加到工程中 2. 把配置文件和扩展词典添加到工程的classpath下 注意:hotword.dic和ext\_stopword.dic文件的格式为UTF-8,注意是无BOM 的UTF-8编码。 也就是说禁止使用windows记事本编辑扩展词典文件 扩展词典: 添加一些新词 停用词词典: 无意义的词或者敏感词汇 使用方法: 第一步:把jar包添加到工程中 第二步:把配置文件和扩展词典和停用词词典添加到classpath下 注意:hotword.dic和ext\_stopword.dic文件的格式为UTF-8,注意是无BOM 的UTF-8编码。 xml可以配置 ~~~ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict">hotword.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties> ~~~ ~~~ @Test public void testTokenStream() throws IOException { //1. 创建一个分词对象 IKAnalyzer analyzer = new IKAnalyzer(); //2. 使用分析器对象的tokenStream方法获得一个TokenStream对象, 域名称,分析的文本内容 TokenStream tokenStream = analyzer.tokenStream("", "1.2.1全文检索"); //3. 向TokenStream对象中设置一个引用,相当于一个指针 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //4. 调用TokenStream对象的rest方法.如果不调用抛异常 tokenStream.reset(); //5. 调用while循环遍历TokenStream对象 while (tokenStream.incrementToken()) { System.out.println(charTermAttribute.toString()); } //6. 关闭TokenStream对象 tokenStream.close(); } ~~~ 扩展字段 ~~~ 文 ~~~ 停用词典 ~~~ 1.2 ~~~ 输出 ~~~ 加载扩展词典:hotword.dic 加载扩展停止词典:stopword.dic 1.2.1 全文 文 检索 ~~~ # 创建索引使用ik分词 IndexWriterConfig那指定ik ~~~ @Test public void createIndex() throws IOException { //1. 创建一个Director对象,指定索引库保存的位置 //把索引保存到磁盘 Directory directory = FSDirectory.open(new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/index").toPath()); //2. 基于Directory对象创建建一个IndexWriter对象, IndexWriter对象默认使用的不是ik IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(directory, config); //3. 读取磁盘上的文件,对应每个文件创建一个文档对象 File dir = new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/search"); File[] files = dir.listFiles(); for (File f : files) { //取文件名 String fileName = f.getName(); //文件的路径 String filePath = f.getPath(); String fileContent = FileUtils.readFileToString(f, "utf-8"); //文件的大小 long fileSize = FileUtils.sizeOf(f); //创建Field //参数1: 域的名称, 参数2: 域的内容, 参数3: 是否存储 TextField fieldName = new TextField("name", fileName, Field.Store.YES); TextField fieldPath = new TextField("path", filePath, Field.Store.YES); TextField fieldContent = new TextField("content", fileContent, Field.Store.YES); TextField fieldSize = new TextField("size", fileSize + "", Field.Store.YES); //创建文档对象 Document document = new Document(); //向文档对象中添加域 document.add(fieldName); document.add(fieldPath); document.add(fieldContent); document.add(fieldSize); //把文档对象写入索引库 indexWriter.addDocument(document); } //关闭indexWriter对象 indexWriter.close(); } ~~~