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

简介:  1  Lucene卡发包结构分析 包名 功能 org.apache.lucene.analysis Analysis提供自带的各种Analyzer org.apache.lucene.collation 包含collationK


1  Lucene卡发包结构分析

包名

功能

org.apache.lucene.analysis

Analysis提供自带的各种Analyzer

org.apache.lucene.collation

包含collationKeyFiltercollationKeyAnalyzer两个相同功能的类,将所有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(TermQueryBooleanQuery)和搜索结果集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); //建立标准分词器,对于汉子采用单自分词

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

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

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

newField(fieldname,value,Store,Index);  将数据建立索引库FieldStore决定是否存储,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:NativeFSLock@D:\work\javaee20130408\lucene3_day1\index\write.lock

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

 

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

 

 

目录
相关文章
|
2月前
|
存储 缓存 算法
亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析
本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家实现数据驱动决策,安全高效优化运营。
|
3月前
|
自然语言处理 监控 API
小红书爆文解码:用API分析互动数据,精准指导创作方向
在内容为王时代,爆文背后有科学公式!通过小红书API抓取百万笔记数据,提炼出点赞转化率、收藏价值系数、评论情感值三大核心指标,揭秘爆文特征不等式与内容元素矩阵,手把手教你用数据驱动创作,实现从0到百万曝光的逆袭!
293 0
|
3月前
|
数据采集 API
京东:调用用户行为API分析购买路径,优化页面跳转逻辑
京东通过整合用户行为API,构建购买路径分析体系,运用马尔可夫链模型识别高损耗、断裂与冗余路径,优化页面跳转逻辑。实施流程合并、预加载及实时干预策略,转化率提升30.2%,路径缩短34.9%,跳转失败率下降78.7%,实现数据驱动的精细化运营。
326 0
|
3月前
|
缓存 监控 供应链
唯品会自定义 API 自定义操作深度分析及 Python 实现
唯品会开放平台提供丰富API,支持商品查询、订单管理、促销活动等电商全流程操作。基于OAuth 2.0认证机制,具备安全稳定的特点。通过组合调用基础接口,可实现数据聚合、流程自动化、监控预警及跨平台集成,广泛应用于供应链管理、数据分析和智能采购等领域。结合Python实现方案,可高效完成商品搜索、订单分析、库存监控等功能,提升电商运营效率。
|
3月前
|
缓存 监控 供应链
京东自定义 API 操作深度分析及 Python 实现
京东开放平台提供丰富API接口,支持商品、订单、库存等电商全链路场景。通过自定义API组合调用,可实现店铺管理、数据分析、竞品监控等功能,提升运营效率。本文详解其架构、Python实现与应用策略。
机器学习/深度学习 搜索推荐 算法
76 0
缓存 监控 供应链
69 0
缓存 监控 数据挖掘
60 0
|
3月前
|
数据采集 数据可视化 API
巧用唯品会 API,精准分析唯品会女性时尚商品销售趋势
本文介绍如何利用唯品会API分析女性时尚商品销售趋势。通过API获取数据、清洗处理后,结合时间序列分析与可视化,精准把握市场需求变化,助力商家优化库存和营销策略,提升用户体验与营收。
157 0
|
3月前
|
数据采集 搜索推荐 API
苏宁易购 API 接口:苏宁易购平台促销活动用户参与度分析
本文探讨如何利用苏宁易购API接口进行促销活动中的用户参与度分析。通过API获取数据,定义关键指标如点击率、转化率及参与度指数,并结合统计分析与回归模型揭示用户行为模式。以“618大促”为例,展示数据驱动的优化策略及其成效,提升用户粘性与销售转化。
113 0