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

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

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

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

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  2. lucene内存索引库、分词器

    内存索引库 特点 在内存中开辟一块空间,专门为索引库存放.这样有以下几个特征: 1)    因为索引库在内存中,所以访问速度更快. 2)    在程序退出时,索引库中的文件也相应的消失了. 3)    ...

  3. 【lucene系列学习四】使用IKAnalyzer分词器实现敏感词和停用词过滤

    Lucene自带的中文分词器SmartChineseAnalyzer不太好扩展,于是我用了IKAnalyzer来进行敏感词和停用词的过滤. 首先,下载IKAnalyzer,我下载了 然后,由于IKAn ...

  4. Lucene全文检索_分词_复杂搜索_中文分词器

    1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search)  1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...

  5. Lucene 6.0下使用IK分词器

    Lucene 6.0使用IK分词器需要修改修改IKAnalyzer和IKTokenizer. 使用时先新建一个MyIKTokenizer类,一个MyIkAnalyzer类: MyIKTokenizer ...

  6. Lucene的中文分词器

    1 什么是中文分词器 学过英文的都知道,英文是以单词为单位的,单词与单词之间以空格或者逗号句号隔开. 而中文的语义比较特殊,很难像英文那样,一个汉字一个汉字来划分. 所以需要一个能自动识别中文语义的分 ...

  7. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

  8. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词

    一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...

  9. Lucene系列三:Lucene分词器详解、实现自己的一个分词器

    一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...

随机推荐

  1. Solr分组聚合查询之Facet

    摘要: Solr的分组聚合是一个笼统的概念,目的就是把查询结果做分类,有多种方式可以做到很类似的结果.也正是由于它们的不同表现,可以适合于多种场景. 何为Facet Facet是一种手段,用来将搜索结 ...

  2. win10开启开发人员模式

    工具: win10 方法如下: 1.在Windows10系统桌面,点击开始菜单,然后在弹出窗口中选择“设置”菜单项 2.在打开的设置窗口中,选择“更新和安全”图标,并点击打开更新和安全窗口 3.在打开 ...

  3. QQ中的国家城市数据。

    在QQ安装目录可以找到loclist.xml文件 C:\Program Files\Tencent\QQ\I18N\2052 以上是中文版,若需要英文版,可安装国际版...在1033目录 code都是 ...

  4. Spring boot with Apache Hive

      5.29.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  5. ES6系列_5之数字操作

    下面是针对ES6新增的一些数字操作方法进行简单梳理. 1.数字判断和转换 (1)数字验证Number.isFinite( xx ) 使用Number.isFinite( )来进行数字验证,只要是数字, ...

  6. javascript instanceof,typeof的区别

    区分string 与 String的区别 为什么结果会是false呢? <script type="text/javascript"> var aColors = [& ...

  7. C#使用UUID生成ID

    tring id = System.Guid.NewGuid().ToString(); 一句话即可,但此时id中有“-”符号存在,使用下面语句可变为纯字母+数字. string id = Syste ...

  8. window 10 javac不是内部或外部命令

    今天在新电脑上配置Java环境变量(window 10),不管怎么配置都是提示“javac不是内部或外部命令”,java,java -version命令是正常的. 后来发现是path路径配置的不对,修 ...

  9. 15.3Sum (Two-Pointers)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  10. 微信小程序-滑动视图注意事项

    真的得吐槽下微信的开发文档,一点点都不详细的好吗. <!--垂直滚动,这里必须设置高度--> <scroll-view scroll-y="true" style ...