代码拉取完成,页面将自动刷新
封装了原生Lucene,提供更便捷的Api,开箱即用。
仓库地址:https://gitee.com/alone_coding/embedded-lucene
通过 @EnableEmbeddedLucene
开启即可
@Data
public class Article {
// 文档的id
@DocId
private Long id;
@DocField(type = FieldType.TEXT)
private String title;
@DocField(type = FieldType.TEXT)
private String content;
@DocField(type = FieldType.TEXT)
private String abContent;
@DocField(type = FieldType.TEXT)
private String author;
// 标记自动填充
@AutoFill
@DocField(type = FieldType.DATE)
private LocalDateTime time;
@DocField(type = FieldType.BOOL)
private boolean deleted;
// 经纬度类型
@DocField(type = FieldType.LATLON)
private LatLon latLon;
}
EmbeddedLucene lucene=EmbeddedLucene.create(
EmbeddedLuceneConfig.builder()
// 数据落盘的位置,相对路径,绝对路径都可以
.indexPath("./embedded-lucene-data")
// 注册映射文档的JAVA类
.registerSource(Article.class)
// 为FieldType设置对应解析器
.fieldTypeAnalyzer(FieldType.TEXT,new IKAnalyzer(true))
// 仓库类扩展插件
// 日志输出
.repositoryHandler(new LogHandler())
// 字段填充
.repositoryHandler(new AutoFillHandler(new DefaultAutoFillValProvider()))
.build());
// 配置完毕后需手动启动
lucene.start();
// 通过EmbeddedLucene创建仓库类
ElRepository<Article> repository=ElRepository.get(lucene.getSource(Article.class));
// 新增
repository.insert(Article.DATA);
// 修改
Article article=repository.select(2L);
article.setContent("updated content");
repository.update(article);
// 删除
repository.delete(Article.DATA);
repository.delete(1L);
// 查询
repository.select(1L);
repository.selectList();
repository.selectPage(PageQuery.of(1,10));
yml配置文件
embedded-lucene:
// 映射类所在的包,支持配置多个,没有配置的话会全量扫描影响启动速度
entity-packages:
- com.alone.embedded.lucene.a
- com.alone.embedded.lucene.b
- com.alone.embedded.lucene.c
// 数据落盘的位置,相对路径,绝对路径都可以
index-path: ./embedded-lucene-data
配置类
// 开启EmbeddedLucene自动配置
@EnableEmbeddedLucene
@Configuration(proxyBeanMethods = false)
public class EmbeddedLuceneConfigure {
/**
* 仓库增强 日志输出
*/
@Bean
public RepositoryHandler logHandler() {
return new LogHandler();
}
/**
* 仓库增强 自动填充
*/
@Bean
public RepositoryHandler autoFillHandler() {
return new AutoFillHandler(new DefaultAutoFillValProvider());
}
/**
* 客制字段解析器
*/
@Bean
public FieldTypeAnalyzerMapper fieldTypeAnalyzerMapper() {
return new DefaultFieldTypeAnalyzerMapper();
}
/**
* 客制JAVA类解析器
*/
@Bean
public Analyzer articleAnalyzer() {
IKAnalyzer ikAnalyzer = new IKAnalyzer(true);
Map<String, Analyzer> fieldAnalyzers = new HashMap<>(8);
fieldAnalyzers.put("title", ikAnalyzer);
fieldAnalyzers.put("content", ikAnalyzer);
fieldAnalyzers.put("abContent", ikAnalyzer);
fieldAnalyzers.put("author", ikAnalyzer);
return new PerFieldAnalyzerWrapper(new StandardAnalyzer(), fieldAnalyzers);
}
}
// 在原生方式里定义的映射类上添加注解即可,类所在包需在上面配置的包扫描内
@ElEntity(value = "article", analyzerBeanName = "articleAnalyzer")
@Service
public class XXXService {
// 直接从Spring容器中获取仓库操作类
@Autowired
private ElRepository<Article> repository;
public void crud() {
// 新增
repository.insert(Article.DATA);
// 修改
Article article = repository.select(2L);
article.setContent("updated content");
repository.update(article);
// 删除
repository.delete(Article.DATA);
repository.delete(1L);
// 查询
repository.select(1L);
repository.selectList();
repository.selectPage(PageQuery.of(1, 10));
}
}
ElRepository提供了三种类型的查询
条件查询包装器(ConditionQueryWrapper)
Wrappers.lambdaQuery()
快速构建作为上述查询的入参使用boolean
类型的参数conditon
, 代表当前方法是否被纳入最终查询中like查询通过SimpleQueryParser实现,语法如下
AND '+' 示例: token1+token2
OR '|' 示例: token1|token2
NOT '-' 示例: -token0
PHRASE '"' 示例: "term1 term2 ..."
PREFIX '*' 示例: term*
FUZZY '~N' 示例: term~1
NEAR '~N' 示例: "term1 term2"~5
PRECEDENCE '()' 示例: token1 + (token2 | token3)
通过PageQuery传入分页信息:
public class PageQuery {
// 当前页码
protected int current;
// 分页大小
protected int size;
}
⚠️注意: 分页查询通过全量扫描然后截取实现,深度分页时可能会出现性能瓶颈甚至异常。
Sorts.<Article>builder()
// 方法:升/降序 , 参数一:排序字段 , 参数二:排序纬度
.asc(Article::getAuthor,SortField.Type.SCORE)
.desc(Article::getId,SortField.Type.LONG)
.build();
Wrappers.<Article>lambdaQuery()
.sortAsc(Article::getAuthor,SortField.Type.SCORE)
.sortDesc(Article::getId,SortField.Type.LONG);
高亮查询开启后会自动应用在1.2 模糊查询(like)
的所有Field上
Wrappers.<Article>lambdaQuery().highlight()
也可以通过Formatter自定义高亮样式
Formatter custStyle=new SimpleHTMLFormatter(String.format("<B style=\"color: %s\">","red"),"</B>")
Wrappers.<Article>lambdaQuery().highlight(custStyle);
不需要高亮的like查询使用
likeNoHighlight(C column, Object value)
方法即可
// 以某个坐标为圆心固定半径搜索,半径单位为m
Querys.latLonRadio(
Article::getLatLon,
LatLon.of(29.0,120.0),
100000.0));
// 一个矩形框内搜索,通过这个矩形的左上坐标和右下坐标框定范围
Querys.latLonBox(
Article::getLatLon,
LatLon.of(29.0,120.0),
LatLon.of(30.0,121.0)));
// 等于
eq(C column, Object value)
// 小于等于
le(C column, Object value)
// 大于等于
ge(C column, Object value)
// 小于
lt(C column, Object value)
// 大于
gt(C column, Object value)
// 不等于
ne(C column, Object value)
// 等价于sql中的in
in(C column, Collection<?> value)
notIn(C column, Collection<?> value)
// 原生查询
query(Query query)
query(Query query, BooleanClause.Occur occur)
// 只在selectList时生效
limit(int limit)
以一个Source(可以理解成一个文档<=>JavaBean的映射类)为最小粒度资源, 特性如下:
UserTransaction transaction = new ElUserTransaction(lucene.getTxManager());
transaction.begin();
repository.insert(Article.DATA);
System.out.println("未提交读。。。。。。。。");
System.out.println(repository.selectPage(PageQuery.of(2, 1)));
System.out.println(repository.select(2L));
transaction.commit();
System.out.println("已提交读。。。。。。。。");
System.out.println(repository.selectPage(PageQuery.of(2, 1)));
System.out.println(repository.select(2L));
使用@ElTransactional
注解,用法与spring的一致
TODO
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。