elasticsearch 高亮搜索字段

系统管理员 2023-06-28 08:39 87阅读 0赞

elasticsearch 高亮搜索字段

#

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

相关类与接口

HighlightBuilder:高亮构造器

  1. public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilder> {
  2. *********
  3. 构造方法
  4. public HighlightBuilder() {
  5. public HighlightBuilder(HighlightBuilder template, QueryBuilder highlightQuery, List<HighlightBuilder.Field> fields) {
  6. public HighlightBuilder(StreamInput in) throws IOException {
  7. *********
  8. 常用方法
  9. public HighlightBuilder field(String name) {
  10. public HighlightBuilder field(String name, int fragmentSize) {
  11. public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments) {
  12. public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments, int fragmentOffset) {
  13. public HighlightBuilder field(HighlightBuilder.Field field) {
  14. void fields(List<HighlightBuilder.Field> fields) {
  15. public List<HighlightBuilder.Field> fields() {

AbstractHighlighterBuilder

  1. public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterBuilder<?>> implements Writeable, Rewriteable<HB>, ToXContentObject {
  2. *********
  3. 常用方法
  4. public HB preTags(String... preTags) { //设置前缀
  5. public String[] preTags() {
  6. public HB postTags(String... postTags) { //设置后缀
  7. public String[] postTags() {

ElasticsearchRestTemplate:操作类

  1. public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate implements ElasticsearchOperations, EsClient<RestHighLevelClient>, ApplicationContextAware {
  2. public <T> AggregatedPage<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper) {

SearchResultMapper:搜索结果映射类

  1. public interface SearchResultMapper {
  2. <T> AggregatedPage<T> mapResults(SearchResponse var1, Class<T> var2, Pageable var3);
  3. @Nullable
  4. <T> T mapSearchHit(SearchHit var1, Class<T> var2);
  5. }

SearchResponse

  1. public class SearchResponse extends ActionResponse implements StatusToXContentObject {
  2. public SearchHits getHits() {

SearchHit

  1. public final class SearchHit implements Streamable, ToXContentObject, Iterable<DocumentField> {
  2. public Map<String, HighlightField> getHighlightFields() {

HightField

  1. public class HighlightField implements ToXContentFragment, Streamable {
  2. public Text[] fragments() {
  3. public Text[] getFragments() {

Text

  1. public final class Text implements Comparable<Text>, ToXContentFragment {
  2. public String string() {
  3. public String toString() {

#

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

示例

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

conroller 层

  1. @RestController
  2. public class PersonController {
  3. @Resource
  4. private PersonRepository personRepository;
  5. @Resource
  6. private ElasticsearchRestTemplate elasticsearchRestTemplate;
  7. @RequestMapping("/save")
  8. public String save(){
  9. for (int i=0;i<100;i++){
  10. Person person=new Person();
  11. person.setId(i);
  12. person.setName("瓜田李下 "+i);
  13. person.setAge(i/10+10);
  14. personRepository.save(person);
  15. }
  16. return "success";
  17. }
  18. @RequestMapping("/highlight")
  19. @SuppressWarnings("unchecked")
  20. public List<Person> highlight(){
  21. QueryBuilder queryBuilder=QueryBuilders.regexpQuery("name","瓜田李下 1.");
  22. HighlightBuilder highlightBuilder=new HighlightBuilder().field("name")
  23. .preTags("<span style='color:red'>").postTags("</span>")
  24. .requireFieldMatch(false);
  25. NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder()
  26. .withQuery(queryBuilder)
  27. .withHighlightBuilder(highlightBuilder).build();
  28. AggregatedPage<Person> aggregatedPage=elasticsearchRestTemplate.queryForPage(nativeSearchQuery,
  29. Person.class, new SearchResultMapper() {
  30. @Override
  31. public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
  32. List<Person> list=new ArrayList<>();
  33. SearchHits searchHits=searchResponse.getHits();
  34. if (searchHits.getHits().length!=0){
  35. for (SearchHit searchHit:searchHits){
  36. Person person=new Person();
  37. Map<String,Object> map=searchHit.getSourceAsMap();
  38. person.setId(Integer.parseInt(map.get("id").toString()));
  39. person.setAge(Integer.parseInt(map.get("age").toString()));
  40. HighlightField nameField=searchHit.getHighlightFields().get("name");
  41. if (nameField!=null){
  42. person.setName(nameField.getFragments()[0].toString());
  43. }else {
  44. person.setName(map.get("name").toString());
  45. }
  46. list.add(person);
  47. }
  48. }
  49. if (list.size()!=0){
  50. return new AggregatedPageImpl<>((List<T>)list);
  51. }
  52. return null;
  53. }
  54. @Override
  55. public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
  56. return null;
  57. }
  58. });
  59. List<Person> list=aggregatedPage.getContent();
  60. list.forEach(System.out::println);
  61. return list;
  62. }
  63. }

#

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

使用测试

/highlight

  1. Person(id=11, name=<span style='color:red'>瓜田李下 11</span>, age=11)
  2. Person(id=13, name=<span style='color:red'>瓜田李下 13</span>, age=11)
  3. Person(id=16, name=<span style='color:red'>瓜田李下 16</span>, age=11)
  4. Person(id=17, name=<span style='color:red'>瓜田李下 17</span>, age=11)
  5. Person(id=19, name=<span style='color:red'>瓜田李下 19</span>, age=11)
  6. Person(id=10, name=<span style='color:red'>瓜田李下 10</span>, age=11)
  7. Person(id=14, name=<span style='color:red'>瓜田李下 14</span>, age=11)
  8. Person(id=12, name=<span style='color:red'>瓜田李下 12</span>, age=11)
  9. Person(id=15, name=<span style='color:red'>瓜田李下 15</span>, age=11)
  10. Person(id=18, name=<span style='color:red'>瓜田李下 18</span>, age=11)

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读

    相关 es搜索展示

    在某些分类电商网站中,经常遇到这样一种需求,对搜索出来的数据的某些字段进行高亮展示,这样让产品的某些属性和特点更加容易受到关注,也就是突出商品卖点 ![在这里插入图片描述]