ElasticsearchOperations实现搜索提示

在SpringBoot容器启动时,会默认初始化标有 @Document 注解的类,若ES中未创建索引,则会以 @Document 中的 indexName 为索引名创建索引,若ES中已存在该索引,则会忽略。在这里先贴一下ES实体类

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Document(indexName = "student")
public class Student implements Serializable {

    private static final long serialVersionUID = 3312542029426741325L;

    @Id
    private String id;

    /**
     * Keyword类型不可分词
     */
    @Field(type = FieldType.Keyword)
    private String name;

    /**
     * IK提供两种分词ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分
     * text类型可分词,手动设置分词器
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String content;

    @Field(type=FieldType.Auto)
    private String address;

    @CompletionField(analyzer="ik_smart",searchAnalyzer="ik_smart", maxInputLength = 100)
    private Completion suggest;


}

项目启动后使用命令在kibana查看索引结构

GET /student/_mapping

结构如下:

{
  "student" : {
    "mappings" : {
      "properties" : {
        "_class" : {
          "type" : "keyword",
          "index" : false,
          "doc_values" : false
        },
        "address" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "content" : {
          "type" : "text",
          "analyzer" : "ik_smart",
          "search_analyzer" : "ik_max_word"
        },
        "name" : {
          "type" : "keyword"
        },
        "suggest" : {
          "type" : "completion",
          "analyzer" : "ik_smart",
          "preserve_separators" : true,
          "preserve_position_increments" : true,
          "max_input_length" : 100
        }
      }
    }
  }
}

新增数据:

@Resource
    private ElasticsearchOperations elasticsearchOperations;

    @RequestMapping("add")
    public Student studentAdd(Student student){
        //搜索补全使用
        List<String> suggestList =  new ArrayList<>();
        suggestList.add(student.getAddress());
        student.setSuggest(new Completion(suggestList.toArray(new String[suggestList.size()])));
        return elasticsearchOperations.save(student);
    }

之后可以使用命令查看数据

GET /student/_search

搜索提示代码:

    @RequestMapping("suggest")
    public List<String> suggest(String keyword){
        // 使用suggest进行标题联想
        CompletionSuggestionBuilder suggest = SuggestBuilders.completionSuggestion("suggest")
                // 关键字(参数传此)
                .prefix(keyword)
                // 重复过滤
                .skipDuplicates(true)
                // 匹配数量
                .size(10);
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("my-suggest",suggest);
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                 .withSuggestBuilder(suggestBuilder).build();
        // 查询
        SearchHits<Student> search = elasticsearchOperations.search(searchQuery, Student.class);
        Suggest.Suggestion<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> suggestion = search.getSuggest().getSuggestion("my-suggest");
        // 处理返回
        List<String> suggests = suggestion.getEntries().stream().map(x -> x.getOptions().stream().map(y->y.getText().toString()).collect(Collectors.toList())).findFirst().get();
        return suggests;
    }

查看结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值