通过注解实现高亮检索
Spring-Data-ElasticSearch提供了注解方式来实现高亮检索,主要用到以下几个注解:
- 开启高亮检索:
@Highlight
- 高亮字段:
@HighlightField
- 高亮字段设置(样式):
@HighlightParameters
创建测试接口
创建自定义仓库,继承 ElasticsearchRepository
public interface ItemRepository extends ElasticsearchRepository<Item, Long> {
/**
* 关键字检索(title)
*
* @param title 标题
* @return
*/
@Highlight(
fields = {
@HighlightField(name = "title")
},
parameters = @HighlightParameters(
preTags = "<strong><font style='color:red'>",
postTags = "</font></strong>",
fragmentSize = 500,
numberOfFragments = 3
)
)
List<SearchHit<Item>> findByTitle(String title);
}
注解说明:通过
@Highlight()
开启高亮检索,fields
设置需要检索的字段;parameters
设置高亮的样式,默认为<em></em>
注解源码解析
@Highlight
: 包括 fields
和 parameters
两个参数
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Highlight {
HighlightParameters parameters() default @HighlightParameters;
HighlightField[] fields();
}
-
HighlightField[] fields();
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface HighlightField { /** * 要应用高亮显示的字段的名称。这必须是实体属性的字段名,而不是名称索引映射中的字段。 */ String name() default ""; HighlightParameters parameters() default @HighlightParameters; }
-
HighlightParameters parameters() default @HighlightParameters;
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface HighlightParameters { String boundaryChars() default ""; int boundaryMaxScan() default -1; String boundaryScanner() default ""; String boundaryScannerLocale() default ""; /** * only used for {@link Highlight}s. */ String encoder() default ""; boolean forceSource() default false; String fragmenter() default ""; /** * only used for {@link HighlightField}s. */ int fragmentOffset() default -1; int fragmentSize() default -1; /** * only used for {@link HighlightField}s. */ String[] matchedFields() default {}; int noMatchSize() default -1; int numberOfFragments() default -1; String order() default ""; int phraseLimit() default -1; String[] preTags() default {}; String[] postTags() default {}; boolean requireFieldMatch() default true; /** * only used for {@link Highlight}s. */ String tagsSchema() default ""; String type() default ""; }
效果
启动项目访问,接口,如
http://127.0.0.1:9999/item/search/小米
-
使用默认样式
可以看到高亮字段使用<em></em>
包括"<em>小米</em>10pro"
-
自定义样式
@Highlight( fields = { @HighlightField(name = "title") }, parameters = @HighlightParameters( preTags = "<strong><font style='color:red'>", postTags = "</font></strong>", fragmentSize = 500, numberOfFragments = 3 ) )
结果被自定义样式包裹:"<strong><font style='color:red'>小米</font></strong>10pro"
版权声明:本文为qq_45794678原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。