- 多字段精确查询 MultiFieldQueryParser使用
Analyzer analyzer = new StandardAnalyzer(); reader=DirectoryReader.open(directory); searcher=new IndexSearcher(reader); //对应的字段 String[] fields = { CommonVars.FILE_ARCHIVE_CATEGORY_ENUM ,CommonVars.FILE_NAME, CommonVars.FILE_BELONGYEAR, CommonVars.FILE_UPLOAD_USER, CommonVars.FILE_DESC}; //每个字段之间的关系 AND OR BooleanClause.Occur[] clauses = { BooleanClause.Occur.MUST ,BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD}; //每个字段查询的内容,这里没有启用模糊查询都是精确查询 String[] queries = {indexType, content, content,content,content}; Query query = MultiFieldQueryParser.parse(queries, fields, clauses, analyzer); LOGGER.debug("查询语句:" + query); TopDocs topDocs = searcher.search(query,INDEX_SEARCH_MAXSIZE+1); LOGGER.debug("总共匹配多少个:" + topDocs.totalHits); ScoreDoc[] hits = topDocs.scoreDocs; // 应该与topDocs.totalHits相同 LOGGER.debug("多少条数据:" + hits.length);
- 模糊查询,基于分词解析器
Analyzer analyzer = new StandardAnalyzer(); reader=DirectoryReader.open(directory); searcher=new IndexSearcher(reader); //对应的字段 String queryStr="+("+indexType+") +( "+LuceneVar.INDEX_OBJNAME+":"+content+" "+LuceneVar.INDEX_OBJDESC+":"+content +" "+LuceneVar.INDEX_OBJCREATOR+":"+content +")"; QueryParser parser=new QueryParser(LuceneVar.LUCENE_INDEX_TYPE_ENUM,analyzer); Query query =parser.parse(queryStr); LOGGER.debug("查询语句:" + query); TopDocs topDocs = searcher.search(query,INDEX_SEARCH_MAXSIZE+1); LOGGER.debug("总共匹配多少个:" + topDocs.totalHits); ScoreDoc[] hits = topDocs.scoreDocs; // 应该与topDocs.totalHits相同 LOGGER.debug("多少条数据:" + hits.length);
- 分词解析器
1)、 StopAnalyzer
StopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。
2)、 StandardAnalyzer
StandardAnalyzer根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。
3)、 SimpleAnalyzer
SimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。
在全文检索系统开发中,通常用来支持西文符号的处理,不支持中文。由于不完成单词过滤功能,所以不需要过滤词库支持。词汇分割策略上简单,使用非英文字符作为分割符,不需要分词词库的支持。
4)、 WhitespaceAnalyzer
WhitespaceAnalyzer使用空格作为间隔符的词汇分割分词器。处理词汇单元的时候,以空格字符作为分割符号。分词器不做词汇过滤,也不进行小写字符转换。
实际中可以用来支持特定环境下的西文符号的处理。由于不完成单词过滤和小写字符转换功能,也不需要过滤词库支持。词汇分割策略上简单使用非英文字符作为分割符,不需要分词词库支持。
5)、 KeywordAnalyzer
KeywordAnalyzer把整个输入作为一个单独词汇单元,方便特殊类型的文本进行索引和检索。针对邮政编码,地址等文本信息使用关键词分词器进行索引项建立非常方便。
6)、 CJKAnalyzer
CJKAnalyzer内部调用CJKTokenizer分词器,对中文进行分词,同时使用StopFilter过滤器完成过滤功能,可以实现中文的多元切分和停用词过滤。在Lucene3.0版本中已经弃用。
7)、 ChineseAnalyzer
ChineseAnalyzer功能与StandardAnalyzer分析器在处理中文是基本一致,都是切分成单个的双字节中文字符。在Lucene3.0版本中已经弃用。
8)、 PerFieldAnalyzerWrapper
PerFieldAnalyzerWrapper功能主要用在针对不同的Field采用不同的Analyzer的场合。比如对于文件名,需要使用KeywordAnalyzer,而对于文件内容只使用StandardAnalyzer就可以了。通过addAnalyzer()可以添加分类器。
9)、 IKAnalyzer
实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。
10)、JE-Analysis
JE-Analysis是Lucene的中文分词组件,需要下载。
11)、 ICTCLAS4J
ictclas4j中文分词系统是sinboy在中科院张华平和刘群老师的研制的FreeICTCLAS的基础上完成的一个java开源分词项目,简化了原分词程序的复杂度,旨在为广大的中文分词爱好者一个更好的学习机会。
12)、 Imdict-Chinese-Analyzer
imdict-chinese-analyzer 是 imdict智能词典 的智能中文分词模块,算法基于隐马尔科夫模型(Hidden Markov Model, HMM),是中国科学院计算技术研究所的ictclas中文分词程序的重新实现(基于Java),可以直接为lucene搜索引擎提供简体中文分词支持。
13)、 Paoding Analysis
Paoding Analysis中文分词具有极 高效率 和 高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G内存个人机器上,1秒可准确分词100万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。
14)、 MMSeg4J
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
- 创建索引
FieldType fieldType =new FieldType(); fieldType.setTokenized(true); fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS); fieldType.setStored(true); fieldType.freeze();//表示索引已被创建不能修改
Field类是文档索引期间很重要的类,控制着被索引的域值
变量名 释义 Index.ANALYZED 使用分析器将域值分解成独立的语汇单元流,并使每个语汇单元都能被搜索,适用于普通文本域 Index.NOT_ANALYZED 对域进行索引,但不对String进行分析,将域值作为单一的语汇单元,适用于索引那些不能被分解的域值,如URL,文件路径,电话号码等 Index.ANALYZED_NO_NORMS 不会在索引中存储norms信息,norms记录了索引中的index-time boost信息,当你进行搜索时比较费内存 Index.NOT_ANALYZED_NO_NORMS 同上,也不存储norms信息,在搜索时减少索引空间和内存耗费Index.No 使对应的域值不被搜索 Index.No 使对应的域值不被搜索
变量名 释义 Stroe.YES 存储域值,该情况下原始字符串全部被保存在索引中,对需要展示搜索结果的域有用,如URL,标题 Stroe.NO 不存储域值,通常跟Index.ANALYZED共同用来索引大的文本域值,不用恢复为初始格式
Lucene笔记
最新推荐文章于 2024-11-10 08:43:33 发布