3.Lucene3.x API分析,Director 索引操作目录,Document,分词器



1  Lucene卡发包结构分析


包名


功能


org.apache.lucene.analysis


Analysis提供自带的各种Analyzer


org.apache.lucene.collation


包含collationKeyFilter和collationKeyAnalyzer两个相同功能的类,将所有token转为CollationKey,与IndexableBinaryStringTools一起存为term


org.apache.lucene.document


Document包中是Document相关各种数据结构,如Document类,Field类等


org.apache.lucene.index


index包中是索引的读写操作类,常用的是对索引文件的segment进行写、合并和优化的IndexWriter类和对索引进行读取和删除操作的IndexReader类


org.apache.lucene.queryParser


queryParser包中是解析查询语句相关的类(常用的是QueryParser类)


org.apache.lucene.search


检索管理,根据查询条件,检索得到结果search包中是从索引中进行搜索的各种不同的Query类(如TermQuery、BooleanQuery等)和搜索结果集Hits类


org.apache.lucene.store


store包中是索引的存储相关类,如Directory类定义了索引文件的存储结构,FSDirectory是存储在文件系统(即磁盘)中的索引存储类,RAMDirectory为存储在内存中的索引存储类


org.apache.lucene.util


util包中是公共工具类,例如时间和字符串之间的转换工具

2  Director
索引操作目录

FSDirectory :磁盘路径,在磁盘中创建文件索引库

RAMDirectory:内存路径,指在内存中创建文件索引库


//当前工程index目录,相对路径

FSDirectory.open(new
File("index"));

//绝对路径

FSDirectory.open(new
File("d:\\index"));

//在类路径下创建

FSDirectory.open(new
File(LuceneTest.class.getResource("/").getFile()));

//内存路径

RAMDirectory
directory = new RAMDirectory();

3
 分词器(主要要完全搜索的不要分词,比如当查询书的书号时不分词)

Analyzer 分词器

new StandardAnalyzer(Version.LUCENE_36); //建立标准分词器,对于汉子采用单自分词


Document索引中文对象,Field文档内部数据信息

每个数据对象,对应一个Document对象

对应一个属性,对应一个Field对象

newField(fieldname,value,Store,Index); 
将数据建立索引库Field,Store决定是否存储,Index决定是否索引分词


Store.YES
存储
、Store.NO 
不存储

Index.NO 
不建立索引

Index.ANALYZED
分词建立索引  
保存权重信息

Index.NOT_ANALYZED
不分词建立索引

Index.ANALYZED_NO_NORMS 
分词建立索引,不存放权重信息

Index.NOT_ANALYZED_NO_NORMS
不分词建立索引,不存放权重信息


Document document =
new Document();

document.add(new
Field("id", article.getId() +
"", Store.YES,

Index.NOT_ANALYZED));//对于id通常不分词的

document.add(newField("title",article.getTitle(),Store.YES,Index.ANALYZED));

document.add(new
Field("content", article.getContent(), Store.YES,Index.ANALYZED));


@Test

//
查询索引库,查看norms效果

public
void testQuery()
throws Exception {

//
建立Query对象--根据标题

String queryString = "Lucene";

//
第一个参数,版本号

//
第二个参数,字段

//
第三个参数,分词器

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);

QueryParser queryParser = new QueryParser(Version.LUCENE_36,
"content",

analyzer);

Query query = queryParser.parse(queryString);

//
根据Query查找

//
索引目录位置

Directory directory = FSDirectory.open(new
File("index"));

IndexSearcher indexSearcher = new IndexSearcher(

IndexReader.open(directory));

//
查询满足结果的前100条数据

TopDocs topDocs = indexSearcher.search(query, 100);

System.out.println("满足结果记录条数:"
+ topDocs.totalHits);

//
获取结果

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

for (int
i = 0; i < scoreDocs.length; i++) {

//
先获得Document下标

int docID = scoreDocs[i].doc;

Document document = indexSearcher.doc(docID);

System.out.println("得分:"
+ scoreDocs[i].score);

System.out.println("id:"
+ document.get("id"));

System.out.println("title:"
+ document.get("title"));

System.out.println("content:"
+ document.get("content"));

}

indexSearcher.close();

}


运行结果:


是否分词,
根据业务查找条件决定

是否存储,
根据业务是否需要返回结果数据
决定

norm是按照词频计算的

问题:Index.ANALYZED 和 Index.ANALYZED_NO_NORMS 区别 

Index.ANALYZED 会保存权重信息

Index.ANALYZED_NO_NORMS 不会保存权重信息

权重会影响得分,得分计算排名,
搜索技术搜索结果
一定要进行排序,按照得分

*
不保存norm值,默认按照 1.0
计算

* norm
是按照词条数
计算,值<= 1

index.ANALYZED_NO_NORMS
效率会高一些

4
索引创建过程

分词器Analyzer

目录Directory

进入索引写入,必须使用IndexWriter,但是在初始化IndexWriter过程中,对目标索引库加锁。

当试图对一个索引库创建多个IndexWriter时,报异常

org.apache.lucene.util.SetOnce$AlreadySetException:The object cannot be set twice!

*使用同一 indexWriterConfig
两次

org.apache.lucene.store.LockObtainFailedException:Lock obtain timed out:[email protected]:\work\javaee20130408\lucene3_day1\index\write.lock

*试图创建第二个IndexWriter
,第一个IndexWriter
还没有关闭,锁文件还在

问题:如果两个线程同时对一个索引库操作怎么办?---解决办法:只能使用同一个IndexWriter对象

时间: 2024-11-25 23:16:47

3.Lucene3.x API分析,Director 索引操作目录,Document,分词器的相关文章

elasticsearch系列三:索引详解(分词器、文档管理、路由详解)

一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如处理文本中的html标签字符.处理完后再交给tokenizer进行分词.一个analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理. tokenizer:分词器,对文本进行分词.一个analyzer必需且只可包含一个tokenizer. token filter:词项过滤器,对to

4.Lucene3.案例介绍,创建索引,查询等操作验证

 案例: Article.java package cn.toto.lucene.quickstart; publicclassArticle { privateintid; private Stringtitle; private Stringcontent; /** * @return the id */ publicint getId() { returnid; } /** * @param id the id to set */ publicvoid setId(int id) {

elasticsearch建立索引操作的API

ElasticSearch-API-Index 索引创建API允许初始化一个索引.ElasticSearch对多重索引提供了支持,包括跨多个索引执行操作.每个索引在创建时可以让一个特定的设置项与其关联. 最简单的方式创建索引 curl -XPUT 'http://localhost:9200/twitter/' 在创建索引的时候指定分片和副本数量,参数格式采用YAML格式 curl -XPUT 'http://localhost:9200/twitter/' -d ' index:   numb

Elasticsearch-PHP 索引操作(转)

索引操作 本节通过客户端来介绍一下索引API的各种操作.索引操作包含任何管理索引本身(例如,创建索引,删除索引,更改映射等等). 我们通过一些常见的操作的代码片段来介绍,然后在表格中列出剩下的方法.REST API的参数是相同的,所以它应该很容易执行你所需要的操作. 创建一个索引 索引操作都包含在一个独特的命名空间中,和根对象上的方法区分开.举个例子,让我们创建一个索引: $client = new Elasticsearch\Client();$indexParams['index'] = '

深入浅出分析MySQL索引设计背后的数据结构

在我们公司的DB规范中,明确规定: 1.建表语句必须明确指定主键 2.无特殊情况,主键必须单调递增 对于这项规定,很多研发小伙伴不理解.本文就来深入简出地分析MySQL索引设计背后的数据结构和算法,从而可以帮你释疑如下问题: 1.为什么innodb表需要主键? 2.为什么建议innodb表主键是单调递增? 3.为什么不建议innodb表主键设置过长? B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.B通常

【MFC】截图编辑插件技术总结(2):现有截屏API分析

作为系列博文的第一篇,先写些简单的吧,也是对自己学习过的东西的总结. BitBlt 首先,是最常用的贴图函数之一的BitBlt,作用是从源DC中拷贝指定大小的图片到目标DC中,至于DC是什么,这里就不再赘述了,请自行百度.下面给出该函数的参数列表: BOOL BitBlt( HDC hdcDest,// 目标DC的Handle int nXDest, // 目标位置的左上角X坐标 int nYDest, // 目标位置的左上角Y坐标 int nWidth, // 需要拷贝的图片的宽 int nH

【转载】8天学通MongoDB——第四天 索引操作

这些天项目改版,时间比较紧,博客也就没跟得上,还望大家见谅. 好,今天分享下mongodb中关于索引的基本操作,我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们 又会花费50%的时间在R上面,因为Read操作对用户来说是非常敏感的,处理不好就会被人唾弃,呵呵. 从算法上来说有5种经典的查找,具体的可以参见我的算法速成系列,这其中就包括我们今天所说的“索引查找”,如果大家对sqlserver比较了解 的话,相信索引查找能给我们带来什么样的性能提升吧. 我们首先插

ElasticSearch+Kibana 索引操作( 附源码)

一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 因为在工作的项目中有使用到所以写下相关的内容,并附带源码 感兴趣的朋友可以自己玩一玩,整个项目都是在Linux上跑的,所以安装步

Mongodb学习笔记三(Mongodb索引操作及性能测试)

第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载. 插入 测试数据 首先插入100万条测试数据 for(var i=1;i<1000000;i++){ var person={ Name:"jack"+i, Age:i, Address:["henan","wuhan"], Course:[ {Name:"shuxue"