天天看点

elasticsearch 高亮搜索字段

elasticsearch 高亮搜索字段

********************

相关类与接口

HighlightBuilder:高亮构造器

public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilder> {

*********
构造方法

    public HighlightBuilder() {
    public HighlightBuilder(HighlightBuilder template, QueryBuilder highlightQuery, List<HighlightBuilder.Field> fields) {
    public HighlightBuilder(StreamInput in) throws IOException {


*********
常用方法

    public HighlightBuilder field(String name) {
    public HighlightBuilder field(String name, int fragmentSize) {
    public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments) {
    public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments, int fragmentOffset) {
    public HighlightBuilder field(HighlightBuilder.Field field) {

    void fields(List<HighlightBuilder.Field> fields) {
    public List<HighlightBuilder.Field> fields() {
           

AbstractHighlighterBuilder

public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterBuilder<?>> implements Writeable, Rewriteable<HB>, ToXContentObject {

*********
常用方法

    public HB preTags(String... preTags) { //设置前缀
    public String[] preTags() {

    public HB postTags(String... postTags) { //设置后缀
    public String[] postTags() {
           

ElasticsearchRestTemplate:操作类

public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate implements ElasticsearchOperations, EsClient<RestHighLevelClient>, ApplicationContextAware {

    public <T> AggregatedPage<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper) {
           

SearchResultMapper:搜索结果映射类

public interface SearchResultMapper {
    <T> AggregatedPage<T> mapResults(SearchResponse var1, Class<T> var2, Pageable var3);

    @Nullable
    <T> T mapSearchHit(SearchHit var1, Class<T> var2);
}
           

SearchResponse

public class SearchResponse extends ActionResponse implements StatusToXContentObject {

    public SearchHits getHits() {
           

SearchHit

public final class SearchHit implements Streamable, ToXContentObject, Iterable<DocumentField> {

    public Map<String, HighlightField> getHighlightFields() {
 
           

HightField

public class HighlightField implements ToXContentFragment, Streamable {

    public Text[] fragments() {
    public Text[] getFragments() {
           

Text

public final class Text implements Comparable<Text>, ToXContentFragment {

    public String string() {
    public String toString() {
           

********************

示例

****************

conroller 层

@RestController
public class PersonController {

    @Resource
    private PersonRepository personRepository;

    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @RequestMapping("/save")
    public String save(){
        for (int i=0;i<100;i++){
            Person person=new Person();
            person.setId(i);
            person.setName("瓜田李下 "+i);
            person.setAge(i/10+10);

            personRepository.save(person);
        }

        return "success";
    }

    @RequestMapping("/highlight")
    @SuppressWarnings("unchecked")
    public List<Person> highlight(){
        QueryBuilder queryBuilder=QueryBuilders.regexpQuery("name","瓜田李下 1.");
        HighlightBuilder highlightBuilder=new HighlightBuilder().field("name")
                .preTags("<span style='color:red'>").postTags("</span>")
                .requireFieldMatch(false);

        NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withHighlightBuilder(highlightBuilder).build();

        AggregatedPage<Person> aggregatedPage=elasticsearchRestTemplate.queryForPage(nativeSearchQuery,
                Person.class, new SearchResultMapper() {
                    @Override
                    public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                        List<Person> list=new ArrayList<>();

                        SearchHits searchHits=searchResponse.getHits();
                        if (searchHits.getHits().length!=0){
                            for (SearchHit searchHit:searchHits){
                                Person person=new Person();

                                Map<String,Object> map=searchHit.getSourceAsMap();
                                person.setId(Integer.parseInt(map.get("id").toString()));
                                person.setAge(Integer.parseInt(map.get("age").toString()));

                                HighlightField nameField=searchHit.getHighlightFields().get("name");
                                if (nameField!=null){
                                    person.setName(nameField.getFragments()[0].toString());
                                }else {
                                    person.setName(map.get("name").toString());
                                }

                                list.add(person);
                            }
                        }

                        if (list.size()!=0){
                            return new AggregatedPageImpl<>((List<T>)list);
                        }

                        return null;
                    }

                    @Override
                    public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
                        return null;
                    }
                });

        List<Person> list=aggregatedPage.getContent();
        list.forEach(System.out::println);

        return list;
    }
}
           

********************

使用测试

/highlight

Person(id=11, name=<span style='color:red'>瓜田李下 11</span>, age=11)
Person(id=13, name=<span style='color:red'>瓜田李下 13</span>, age=11)
Person(id=16, name=<span style='color:red'>瓜田李下 16</span>, age=11)
Person(id=17, name=<span style='color:red'>瓜田李下 17</span>, age=11)
Person(id=19, name=<span style='color:red'>瓜田李下 19</span>, age=11)
Person(id=10, name=<span style='color:red'>瓜田李下 10</span>, age=11)
Person(id=14, name=<span style='color:red'>瓜田李下 14</span>, age=11)
Person(id=12, name=<span style='color:red'>瓜田李下 12</span>, age=11)
Person(id=15, name=<span style='color:red'>瓜田李下 15</span>, age=11)
Person(id=18, name=<span style='color:red'>瓜田李下 18</span>, age=11)
           

继续阅读