通过注解实现高亮检索

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 : 包括 fieldsparameters 两个参数

@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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_45794678/article/details/111188548