修改Lucene源码

ES1314 回复了问题 • 2 人关注 • 1 个回复 • 80 次浏览 • 2 天前 • 来自相关话题

lucence如何进行分页

rochy 回复了问题 • 2 人关注 • 1 个回复 • 221 次浏览 • 2019-03-05 09:23 • 来自相关话题

lucence构建索引几分钟后报错

回复

lvwendong 发起了问题 • 1 人关注 • 0 个回复 • 227 次浏览 • 2019-03-01 16:43 • 来自相关话题

lucene倒排索引关于数据压缩的问题

zqc0512 回复了问题 • 5 人关注 • 3 个回复 • 621 次浏览 • 2018-09-17 09:02 • 来自相关话题

Lucene用LongPoint或者StringField或者IntPoint做主键,哪个效率更高?

回复

codepub 发起了问题 • 1 人关注 • 0 个回复 • 453 次浏览 • 2018-04-23 17:00 • 来自相关话题

一个简单的Lucene工具类,通过注释的方式来配置构建索引的字段。提供新建索引、查找、删除、更新方法,支持分页。

pengshaojie 发表了文章 • 6 个评论 • 933 次浏览 • 2018-02-12 10:23 • 来自相关话题

代码地址:https://gitee.com/shaojiepeng/wsm-lucene
 ### wsm-lucene
一个简单的Lucene工具类,通过注释的方式来配置构建索引的字段。提供新建索引、查找、删除、更新方法,支持分页。

### 所需jar包
1. lucene-core:2.4.0
2. lucene-analyzers:2.4.1
3. commons-logging:1.2

### 背景
以前在做某个feature的时候,鉴于存储在DB中的数据量过大,故使用Lucene来优化查找性能。
相信大家在某些场景下会把DB中的数据读出来,建索引来优化查找。那么这个工具类就比较适合这些场景了。

### 如何使用
 **从附件中下载jar包直接导入到项目中,或者下载此Maven项目的源码,使用项目依赖的方式导入你的项目。** 

1. 通过注释的方式配置需要构建索引的model类

```
 **@IndexClass** :注释,说明此model类需要构建索引
 **indexDirPath** :索引所存放的物理位置,如:"D:/Index"

 **@IndexField** :注释,说明此字段需要构建索引
 **fieldStore** :Lucene中的Field.Store同义,不懂请自行查询资料
 **fieldIndex** :Lucene中的Field.Index同义,不懂请自行查询资料
```

173117_4fa2ac08_980808.png



2. 创建索引
```

IndexService indexService = new IndexServiceImpl();
/** 构建索引的接口
 * List:model的集合
 * Class: model的class
 *
 * return boolean
**/
indexService.buildIndex(List, Class)
```

173148_bb488cf0_980808.png



3.查找
```
ArrayList<SearchParamModel> searchParams = new ArrayList<>();
/**添加查询的条件,如果有多个查询条件,则添加SearchParamModel
 * fieldName:需要查找的字段,即model中的成员变量
 * fieldValue:需要查找字段的值,这个不解释
 * BooleanType:Lucene中BooleanClause.Occur值,不懂请自行查询资料
**/
searchParams.add(new SearchParamModel(fieldName, fieldValue, BooleanType));
IndexService indexService = new IndexServiceImpl();
/** 查询的接口
 * searchParams:不解释
 * Class: model的class
 *
 * return model的集合
**/
List objs = indexService.search(searchParams, Class);
```

173219_367ef1d0_980808.png




IndexService中还支持update, delete和分页查找的方法,请自行查阅代码。


觉得不错,请点个赞吧。

倒排索引删除文档

回复

temp150 发起了问题 • 1 人关注 • 0 个回复 • 835 次浏览 • 2017-12-24 16:09 • 来自相关话题

Lucene如何实现SpanAndQuery,即SpanTermQuery与逻辑?

回复

codepub 发起了问题 • 1 人关注 • 0 个回复 • 740 次浏览 • 2017-12-05 11:15 • 来自相关话题

我有个问题,如何用lucene语法去重呀

rockybean 回复了问题 • 2 人关注 • 1 个回复 • 2435 次浏览 • 2017-12-01 18:41 • 来自相关话题

lucene count奇怪的问题

回复

codepub 发起了问题 • 1 人关注 • 0 个回复 • 832 次浏览 • 2017-11-30 20:46 • 来自相关话题

Lucene使用GroupingSearch分组和用FirstPassGroupingCollector、SecondPassGroupingCollector分组有什么区别?

回复

codepub 发起了问题 • 1 人关注 • 0 个回复 • 775 次浏览 • 2017-11-15 11:47 • 来自相关话题

Lucene中如何获取一个字段中所有term的tf最大的那个值

回复

kittenll 发起了问题 • 1 人关注 • 0 个回复 • 2204 次浏览 • 2017-09-06 17:04 • 来自相关话题

luece 6.4 归并倒排链表时支持倒排链表截断吗,在哪设置,还有倒排链表只能按照id排序吗

回复

cat 回复了问题 • 1 人关注 • 1 个回复 • 3400 次浏览 • 2017-06-01 16:05 • 来自相关话题

2017年学习内容

guoshuangjiang 发表了文章 • 4 个评论 • 2684 次浏览 • 2017-01-05 18:05 • 来自相关话题

  • 重新看lucene源码
  • 看es源码
  • 对比lucene和es
  • 基于lucene实现自己的搜索框架

  • 重新看lucene源码
  • 看es源码
  • 对比lucene和es
  • 基于lucene实现自己的搜索框架

Lucene5.5入门第十篇完结篇——使用Highlighter使关键词高亮

kl 发表了文章 • 0 个评论 • 3548 次浏览 • 2016-06-24 11:27 • 来自相关话题

前言

我们在使用百度和谷歌等搜索引擎的时候,你会发现,搜索引擎会把和我们输入的关键字以红色的字体显示,来突出显示结果的准确性,这就是高亮显示的使用场景

准备

使用Highlighter需要导入相应的jar包,maven项目可以加入如下依赖

<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.5.0</version>
</dependency>

直接看代码


/**
* @author kl by 2016/3/19
* @boke www.kailing.pub
*/
public class FieldSetBoostTest {
//索引目录
String indexDir="E:\\LuceneIndex";
//测试数据
String theme="中国";
String []title={"中国是一个伟大的国家","我爱你的的祖国,美丽的中国","是什么,中国令美日等国虎视眈眈"};
/**
* Lucence5.5返回IndexWriter实例
* @param directory
* @return
*/
public IndexWriter getIndexWriter(Directory directory){
Analyzer analyzer=new CJKAnalyzer();//中日韩二元分词
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);
IndexWriter writer=null;
try {
writer =new IndexWriter(directory,writerConfig);
}catch (Exception e){
e.printStackTrace();
}
return writer;
}
public Directory getDirctory(String indexDir){
Directory directory=null;
try {
directory=FSDirectory.open(Paths.get(indexDir));
}catch (IOException e){
e.printStackTrace();
}
return directory;
}
/**
* 创建索引不加权
* @throws Exception
*/
public void Indexer()throws Exception{
IndexWriter writer=getIndexWriter(getDirctory(indexDir));
Document doc=null;
for(String str:title){
doc=new Document();
//Lucence5.5 Fileld有多个实现,StringFIeld不分词 TextField分词
doc.add(new StringField("theme",theme, Field.Store.YES));
Field field=new TextField("title",str, Field.Store.YES);
doc.add(field);
writer.addDocument(doc);
}
writer.close();
}

/**
* 关键命中词高亮输出处理
* @param query
* @param context
* @return
* @throws Exception
*/
public static String getHighlighterString(Query query,String context)throws Exception{
//对促成文档匹配的实际项进行评分
QueryScorer scorer=new QueryScorer(query);
//设置高亮的HTML标签格式
Formatter simpleHTMLFormatter=new SimpleHTMLFormatter("","");
//实例化高亮分析器
Highlighter highlighter=new Highlighter(simpleHTMLFormatter,scorer);
//提供静态方法,支持从数据源中获取TokenStream,进行token处理
TokenStream tokenStream=new CJKAnalyzer().tokenStream("title", new StringReader(context));
return highlighter.getBestFragment(tokenStream, context);
}
@Test
public void searcherTest()throws Exception{
// Indexer();
IndexReader reader= DirectoryReader.open(getDirctory(indexDir));
IndexSearcher is=new IndexSearcher(reader);
System.out.println("总的文档数:"+reader.numDocs());
QueryParser qp=new QueryParser("title",new CJKAnalyzer());
String q="中国";
Query query=qp.parse(q);
TopDocs tDocs=is.search(query,11);
System.out.println("查询-》"+q+"《-总共命中【"+tDocs.totalHits+"】条结果");
for (ScoreDoc scoredoc:tDocs.scoreDocs){
Document doc = is.doc(scoredoc.doc);
String context=doc.get("title");
if(context!=null){
System.out.println(getHighlighterString(query,context));
}

}
}
}
查询效果如下:

原文地址:http://www.kailing.pub/article/index/arcid/82.html