lucene整理3 -- 排序、过滤、分词器

1.    排序

1.1. Sort类

public Sort()

public Sort(String field)

public Sort(String field,Boolean reverse)  //默认为false,降序排序

public Sort(String[] fields)

public Sort(SortField field)

public Sort(SortField[] fields)

Sort sort=new Sort(“bookname”);按照“bookname“这个Field值进行降序排序

Sort sort=new Sort(“bookname”,true) //升序排序

Sort sort=new Sort(new String[]{“bookNumber”,”bookname”,”publishdate”});按照三个Field进行排序,但无法指定升序排序,所以用SortField

1.2. SortField类

public SortField(String field)

public SortField(String field,Boolean reverse)

public SortField(String field,int type) //type表示当前Field值的类型

public SortField(String field,int type,boolean reverse)  //默认为false,升序

Field值的类型:SortField.STRING、SortField.INT、SortField.FLOAT

SortField sf1=new SortField(“bookNumber”,SortField.INT,false);

SortField sf2=new SortField(“bookname”,SortField.STRING,false);

1.3. 指定排序的法则

1.3.1.按照文档的得分降序排序

Hits hits=searcher.search(query,Sort.RELEVANCE);

1.3.2.按文档的内部ID升序排序

Hits hits=searcher.search(query, Sort.INDEXORDER);

1.3.3.按照一个Field来排序

Sort sort=new Sort();

SortField sf=new SortField(“bookNumber”,SortField.INT,false);

sort.setSort(sf);

Hits hits=searcher.search(query,sort);

1.3.4.按照多个Field来排序

Sort sort=new Sort();

SortField sf1=new SortField(“bookNumber”,SortField.INT,false);//升序

SortField sf2=new SortField(“publishdate”,SortField.STRING,true);//降序

sort.setSort(new SortField[]{sf1,sf2});

Hits hits=searcher.search(query,sort);

1.3.5.改变SortField中的Locale信息

String str1=”我”; String str2=”你”;

Collator co1=Collator.getInstance(Locale.CHINA);

Collator co2=Collator.getInstance(Locale.JAPAN);

System.out.println(Locale.CHINA+”:”+co1.compare(str1,str2));

System.out.println(Locale.JAPAN+”:”+co2.compare(str1,str2));

输出结果为:

zh_CN:1

ja_JP:-1

所以

public SortField(String field,Locale locale)

public SortField(String field,Locale locale,boolean reverse)

2.    过滤器

使用public Hits search(Query query,Filter filter)

(1)简单过滤

Hits hits=searcher.search(query,new AdvancedSecurityFilter());//过滤掉securitylevel为0的结果

(2)范围过滤—RangeFilter

只显示中间的

RangeFilter filter=new RangeFilter(“publishdate”,”1970-01-01”,”1998-12-31”,true,true”);

Hits hits=searcher.search(query,filter);

无上边界

public static RangeFilter More(String fieldname,String lowerTerm)

无下边界

public static RangeFilter Less(String fieldname,String upperTerm)

(3)在结果中查询QueryFilter

RangeQuery q=new RangeQuery(new Term(“publicshdate”,”1970-01-01”),

new Term(“publishdate”,”1999-01-01”),true);

QueryFilter filter=new QueryFilter(q);

Hits hits=searcher.search(query,filter);

3.    分析器Analysis

3.1. 自带分析器和过滤器

  • 标准过滤器:StandardAnalyzer
  • 大小写转换器:LowerCaseFilter
  • 忽略词过滤器:StopFilter

public StopFilter(TokenStream input,String [] stopWords)

public StopFilter(TokenStream in,String [] stopWords,boolean ignoreCase)

public StopFilter(TokenStream input,Set stopWords,boolean ignoreCase)

public StopFilter(TokenStream in, Set stopWords)

其中,参数TokenStream代表当前正在进行处理的流;String类型的数组代表一个用数组表示的忽略词集合;Set类型的参数与String一样,是用来表示忽略词集合的;boolean表示当与忽略词集合中的词进行匹配时,是否需要忽略大小写。

  • 长度过滤器:LengthFilter
  • PerFieldAnalyzerWrapper
  • WhitespaceAnalyzer

String str="str1 str2 str3";

StringReader reader=new StringReader(str);

Analyzer anlyzer=new WhitespaceAnalyzer();

TokenStream ts=anlyzer.tokenStream("", reader);

Token t=null;

while( (t=ts.next())!=null ){

System.out.println(t.termText());

}

3.2. 第三方过分析器

  • 单字分词
  • 二分法:CJKAnalyzer、中科院ICTCLAS分词、JE分词
  • 词典分词

3.2.1.JE分词用法

3.2.1.1.    示例

import jeasy.analysis.MMAnalyzer;

IndexWriter writer = new IndexWriter(INDEX_STORE_PATH, new MMAnalyzer()

, true);

String str=" Lucene是一个全文检索引擎的架构,"+

"提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快" +

"速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用" +

"中实现针对应用的全文索引、检索功能,本总结使用lucene--2.3.2。";

MMAnalyzer analyzer=new MMAnalyzer();

try{

System.out.println(analyzer.segment(str, "|"));

}

catch(Exception e)

{

e.printStackTrace();

}

输出结果:lucene|一个|全文|检索|引擎|架构|提供|完整|查询|。。。。

3.2.1.2.    设定正向最大匹配的字数

MMAnalyzer analyzer=new MMAnalyzer(4);

3.2.1.3.    添加新词

MMAnalyzer.addWord(String word);

MMAnalyzer.addDictionary(Reader reader);

MMAnalyzer analyzer=new MMAnalyzer();

MMAnalyzer.addWord("迈克尔雷第");

4.    索引的合并

RAMDirectory RAMDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(RAMDir, new StandardAnalyzer(), true);//删除原有索引

IndexWriter writer2=new IndexWriter(FSDirectory.getDirectory(path,true),

new StandardAnalyzer(), true);

writer.addDocument(doc1);

writer2.addDocument(doc2);

writer.close();

writer2.addIndexes(new Directory[]{RAMDir});

writer2.close();

注意:在合并前一定要先关闭要加的索引器。

时间: 2024-08-29 14:57:03

lucene整理3 -- 排序、过滤、分词器的相关文章

lucene内存索引库、分词器

内存索引库 特点 在内存中开辟一块空间,专门为索引库存放.这样有以下几个特征: 1)    因为索引库在内存中,所以访问速度更快. 2)    在程序退出时,索引库中的文件也相应的消失了. 3)    如果索引库比较大,必须得保证足够多的内存空间. 编码 在cn.hqu.directory 下新建:DirectoryTest /** * 1.能不能设置很多个索引库 *    可以设置很多个索引库 * 2.索引库能不能合并起来 *    如果是内存索引库 *      Directory ramD

Lucene.Net3.0.3+盘古分词器学习使用

一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎.开发人员可以基于Lucene.net实现全文检索的功能. Lucene.net是Apache软件基金会赞助的开源项目,基于Apache License协议. Lucene.net并不是一个爬行搜索引擎,也不会自动地索引内容.我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene.

Lucene实现自定义中文同义词分词器

---------------------------------------------------------- lucene的分词_中文分词介绍 ---------------------------------------------------------- Paoding:庖丁解牛分词器.已经没有更新了 mmseg:使用搜狗的词库 1.导入包(有两个包:1.带dic的,2.不带dic的) 如果使用不带dic的,得自己指定词库位置 2.创建MMSegAnalyzer(指明词库所在的位置

基于lucene的案例开发:分词器介绍

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/42916755 在lucene创建索引的过程中,数据信息的处理是一个十分重要的过程,在这一过程中,主要的部分就是这一篇博客的主题:分词器.在下面简单的demo中,介绍了7中比较常见的分词技术,即:CJKAnalyzer.KeywordAnalyzer.SimpleAnalyzer.StopAnalyzer.WhitespaceAnalyzer.StandardAnalyzer.I

Lucene内置的Analyzer分词器

写这篇博客的时候自己在已经读到第六章分词器了,在写代码之前,这个分词器,让我起了浓厚的兴趣. //===========================================================================================// 以下四条分词器适用于英文,不适用于中文 //=====================================================================================

Lucene系列:(6)分词器

1.什么是分词器 采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索 2.为什么要分词器 因为用户输入的搜索的内容是一段文本中的一个关健字,和原始表中的内容有差别,但作为搜索引擎来讲,又得将相关的内容搜索出来,此时就得采用分词器来最大限度匹配原始表中的内容. 3.分词器工作流程 (1)按分词器拆分出词汇 (2)去除停用词和禁用词 (3)如果有英文,把英文字母转为小写,即搜索不分大小写 4.演示常用分词器测试 这里测试需要引入IKAnalyzer3.2.0Stable.j

搜索引擎系列四:Lucene提供的分词器、IKAnalyze中文分词器集成

一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在pom.xml里面引入如下依赖 <!-- lucene 核心模块 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId&

搜索技术:solr+IK分词器配置

一.搭建solr服务器1.Apache官网下载solr,本次使用4.9.1版本2.解压solr,找到example,将webapps中的war包复制到tomcat的webapps下3.运行tomcat,关闭tomcat,得到解压后的solr文件夹,删除war包4.将example\lib\ext\*.jar复制到解压后的solr\WEB-INF\lib中5.将example文件下solr文件夹的地址放到步骤6的/put/your/solr/home/here位置6.修改web.xml <env-

solr添加中文IK分词器,以及配置自定义词库

Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易于安装和配置,而且附带了一个基于HTTP 的管理界面.Solr已经在众多大型的网站中使用,较为成熟和稳定.Solr 包装并扩展了Lucene,所以Solr的基本上沿用了Lucene的相关术语.更重要的是,Solr 创建的索引与 Lucene搜索引擎库完全兼容.通过对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以