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));

//
条数据

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:NativeFSLock@D:\work\javaee20130408\lucene3_day1\index\write.lock

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

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

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

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

    一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...

  2. Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】

    对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...

  3. elasticsearch入门使用(四) 索引、安装IK分词器及增删改查数据

    一.查看.创建索引 创建一个名字为user索引: curl -X PUT 'localhost:9200/stu' {"acknowledged":true,"shard ...

  4. solr常用操作及集成分词器或cdh集群部署说明

    首先,如果是从http://lucene.apache.org/solr/下载的solr,基本都是自带集成的jetty服务,不需要单独搭建tomcat环境,但是要注意jdk版本,直接解压通过cmd命令 ...

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

     案例: Article.java package cn.toto.lucene.quickstart; publicclassArticle { privateintid; private St ...

  6. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  7. lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3

    前言: lucene全文搜索之一中讲解了lucene开发搜索服务的基本结构,本章将会讲解如何创建索引器.管理索引目录和中文分词器的使用. 包括标准分词器,IKAnalyzer分词器以及两种索引目录的创 ...

  8. Elasticsearch (1) - 索引库 文档 分词

    创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...

  9. elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复

    摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...

随机推荐

  1. [JLOI 2012]树

    Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...

  2. [HNOI2015]接水果

    题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更加难的版本. 首先有 ...

  3. hdu 5643 BestCoder Round #75

    King's Game  Accepts: 249  Submissions: 671  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6 ...

  4. [bzoj4849][Neerc2016]Mole Tunnels

    来自FallDream的博客,未经允许,请勿转载,谢谢 貌似是省队集训女队讲的题... 今天在bzoj找一道题无果,但是翻到了这道就顺便写了下. 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意 ...

  5. bzoj 4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  6. Codeforces #Round 406(Div.2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------- 大家好,我是一个假人.在学习O ...

  7. 使用JAXB解析xml文件(一)

      1.java中解析xml的几种方式 1.1 JDK原生dom形式 原理:一次性把xml读入内存,在内存中构建成树形结构.优点:对节点操作方便,缺点:需要大量的内存空间,浪费资源 1.2 SAX形式 ...

  8. C++函数式编程实现牛顿法

    In numerical analysis, Newton's method (also known as the Newton–Raphson method), named after Isaac ...

  9. Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版

    [引言]最近接手了公司的关于虫子识别的项目,使用MXNet框架开发,但是实际用的是Deformable-ConvNets. Deformable-ConvNets为微软研究研究院提出的可变卷积网络,可 ...

  10. c++ primer第15章这几个例子中的构造函数形式不太理解

    //向基类构造函数传递实参p491 class Bulk_item : public Item_base{ public: Bulk_item(,double disc_rate = 0.0): It ...