-
Lucene
倒排索引
问题:什么是倒排索引?
说明:查询方式发生变化,先查询索引文件,在根据索引查询文件的位置,最终实现文件的查询.
传统的检索方式:
以文章为例,如果需要在百度中查询一片文章,如果按照文章的内容来查询.则传统的手段是先加载全部的文章之后循环遍历直到找到符合的文章为止.
缺点:查询的速度特别慢,资源浪费严重
数据结构:二叉树, B+树,B-树
jar包 <!-- 全文检索lucene -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.10.2</version>
</dependency>
<!-- IK分词器 -->
<dependency>
<groupId>org.wltea.analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>2012FF_u1</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.2.1</version>
</dependency>
<!-- 爬虫jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.9.1</version>
</dependency>
测试代码
public class TestSolr {
/**
* 全文检索的流程
* 1,为给定的字段创建索引文件
* 2,当用户进行查询时,根据索引获取具体的文件
*
* @throws IOException
*/
@Test
public void test01() throws IOException{
//创建索引文件存放目录 会在当前工程下建立index目录
Directory directory = FSDirectory.open(new File("./index"));
//定义分词器 定义标准分词器
//Analyzer analyzer = new StandardAnalyzer();
//切换中文分词器
//Analyzer analyzer = new ChineseAnalyzer();
Analyzer analyzer = new IKAnalyzer();
//创建配置文件 定义版本号
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
//创建索引文件
IndexWriter indexWriter = new IndexWriter(directory, conf);
//创建文档对象:
Document document = new Document();
/**
* 参数名称:
* id :属性字段名称 value值 Store 表示是否存储 yes表示存入
*/
document.add(new LongField("id", 5025991L, Store.YES));
document.add(new TextField("title", "vivo X20 全面屏双摄拍照手机 4GB+64GB 磨砂黑 移动联通电信全网通4G手机 双卡双待 ", Store.YES));
document.add(new TextField("sellPoint", "游戏免打扰,畅快体验,带你吃鸡、上王者!高清全面屏,尊享Hi-Fi音质,更有面部识别+指纹双解锁!", Store.YES));
document.add(new DoubleField("price", 2988.00, Store.YES));
document.add(new TextField("itemDesc", "分辨率:2160*1080分辨后置摄像头:2x1200万像素+500万像素(2400万感光单元)前置摄像头:2x1200万像素(2400万感光单元) 核 数:八核", Store.YES));
//将索引文件写入到文档中
indexWriter.addDocument(document);
indexWriter.close();
}
@Test
public void seracher() throws IOException{
Directory directory = FSDirectory.open(new File("./index"));
//创建检索文件
IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(directory));
//创建查询条件 Term表示分组
Query query = new TermQuery(new Term("title", "手机"));
//查询 results 表示最顶端的20条记录数
TopDocs docs = indexSearcher.search(query, 20);
//访问总数
System.out.println("数据访问的总数:"+docs.totalHits);
//获取文章的得分
for ( ScoreDoc scoreDoc : docs.scoreDocs) {
System.out.println("获取文章的得分:"+scoreDoc.score); //分数越高 越靠前
int index = scoreDoc.doc; //获取索引值
//获取文章内容
Document document = indexSearcher.doc(index);
//输出文章内容
System.out.println("标题:"+document.get("title"));
System.out.println("卖点:"+document.get("sellPoint"));
System.out.println("价格:"+document.get("price"));
System.out.println("描述信息:"+document.get("itemDesc"));
}
directory.close();
}
}
总结:lucene只能够为一些简单的数据创建索引文件,