大型运输行业实战_day15_1_全文检索之Lucene

1.引入

      全文检索简介: 非结构化数据又一种叫法叫全文数据。从全文数据(文本)中进行检索就叫全文检索。

 

 

2.数据库搜索的弊端

    案例 :
     select  *  from product  where product like ‘苹果’g
1、 使用like,会导致索引失效
    (没有索引时)速度相对慢
2、 搜索效果不好
3、 没有相关度排序


3.全文解锁实现原理

4.简单使用

    4.1.创建索引与搜索索引

          首先导入jar包

         

         代码:

  1 package com.day02.lucene;
  2 
  3 import org.apache.lucene.analysis.Analyzer;
  4 import org.apache.lucene.analysis.standard.StandardAnalyzer;
  5 import org.apache.lucene.document.Document;
  6 import org.apache.lucene.document.Field;
  7 import org.apache.lucene.document.FieldType;
  8 import org.apache.lucene.index.DirectoryReader;
  9 import org.apache.lucene.index.IndexReader;
 10 import org.apache.lucene.index.IndexWriter;
 11 import org.apache.lucene.index.IndexWriterConfig;
 12 import org.apache.lucene.queryparser.classic.ParseException;
 13 import org.apache.lucene.queryparser.classic.QueryParser;
 14 import org.apache.lucene.search.IndexSearcher;
 15 import org.apache.lucene.search.Query;
 16 import org.apache.lucene.search.ScoreDoc;
 17 import org.apache.lucene.search.TopDocs;
 18 import org.apache.lucene.store.Directory;
 19 import org.apache.lucene.store.FSDirectory;
 20 import org.apache.lucene.util.Version;
 21 import org.junit.Test;
 22 
 23 import java.io.File;
 24 import java.io.IOException;
 25 
 26 /**
 27  * Created by Administrator on 2/10.
 28  */
 29 public class HelloLucene {
 30     //索引地址目录
 31     private String file = "E:\lucene\indexOne";
 32     //索引版本配置
 33     private Version matchVersion = Version.LUCENE_4_10_4;
 34     //案例文档
 35     private String doc1 = "Hello world Hello";
 36     private String doc2 = "Hello java world Hello Hello";
 37     private String doc3 = "Hello lucene world";
 38 
 39     /**
 40      * 创建索引代码
 41      *
 42      * @throws IOException
 43      */
 44     @Test
 45     public void testCreateIndex() throws IOException {
 46         System.out.println("-----测试开始------");
 47         //创建索引目录地址对象
 48         Directory directory = FSDirectory.open(new File(file));
 49         //指定分词规则
 50         Analyzer analyzer = new StandardAnalyzer();
 51         //创建索引配置对象
 52         IndexWriterConfig conf = new IndexWriterConfig(matchVersion, analyzer);
 53         //创建索引对象
 54         IndexWriter indexWriter = new IndexWriter(directory, conf);
 55         //创建文本属性
 56         FieldType fieldType = new FieldType();
 57         fieldType.setStored(true);//存储数据
 58         fieldType.setIndexed(true);//添加索引
 59 
 60         //创建要添加的文本对象
 61         Document document1 = new Document();
 62         document1.add(new Field("doc", doc1, fieldType));
 63         //添加索引
 64         indexWriter.addDocument(document1);
 65 
 66         //创建要添加的文本对象
 67         Document document2 = new Document();
 68         document2.add(new Field("doc", doc2, fieldType));
 69         //添加索引
 70         indexWriter.addDocument(document2);
 71 
 72         //创建要添加的文本对象
 73         Document document3 = new Document();
 74         document3.add(new Field("doc", doc3, fieldType));
 75         //添加索引
 76         indexWriter.addDocument(document3);
 77 
 78         //关闭资源
 79         indexWriter.close();
 80     }
 81 
 82     /**
 83      *获取索引
 84      * 1.创建查询分析器(QueryParser),使用查询分析器得到查询对象
 85      * 2.使用索引搜索器(IndexSearcher).search(查询对象, 获取的多少条数据),使用索引搜索器获得文档结果集(TopDocs)
 86      * 3.遍历文档结果集获取文档id
 87      * 4.使用IndexSearcher通过文档id获取文档对象,并获取文档具体字段值
 88      */
 89     String key = "lucene";
 90 
 91     @Test
 92     public void testSearchIndex() throws IOException, ParseException {
 93         System.out.println("-----测试开始------");
 94         //1.创建索引目录地址对象
 95         Directory directory = FSDirectory.open(new File(file));
 96         //2.创建目录阅读器
 97         IndexReader indexReader = DirectoryReader.open(directory);
 98         //3.创建索引搜索器
 99         IndexSearcher indexSearcher = new IndexSearcher(indexReader);
100         //需要查询的字段
101         String query = "doc";
102         //4.创建分词器
103         StandardAnalyzer standardAnalyzer = new StandardAnalyzer();
104         //5.创建查询分析器
105         QueryParser queryParser = new QueryParser(query, standardAnalyzer);
106         //6.使用查询分析器(查询关键字)获取对应的对象
107         Query parse = queryParser.parse(key);
108         //7.获取查询结果
109         int n = 1000;//最大返回对象数
110         TopDocs topDocs = indexSearcher.search(parse, n);
111         //8.获取总天数
112         int totalHits = topDocs.totalHits;
113         System.out.println("totalHits=>" + totalHits);
114         //9.获取查询返回结果集
115         ScoreDoc[] scoreDocs = topDocs.scoreDocs;
116         //10.遍历结果集
117         for (ScoreDoc scoreDoc : scoreDocs) {
118             //获取文档主键
119             int docId = scoreDoc.doc;
120             System.out.println("docId=" + docId);
121             //通过文档Id获取文档对象
122             Document doc = indexSearcher.doc(docId);
123             //获取文档值
124             String docValue = doc.get("doc");//根据存放的key
125             System.out.println("docValue=" + docValue);
126         }
127     }
128 }

       创建索引测试结果如下:

       

     执行索引搜索结果如下图:

    

5.执行流程

   

   

原文地址:https://www.cnblogs.com/newAndHui/p/8438433.html