首页 > 编程语言 >elasticsearch通过Java class类的@Setting和@Mapping来定义索引index

elasticsearch通过Java class类的@Setting和@Mapping来定义索引index

时间:2023-10-13 23:01:15浏览次数:28  
标签:index Java keyword type Mapping private analyzer true store

今天就来和大家讲讲如何将es索引中的mapping和setting在索引index和class联系起来,其实在这个问题也困扰我好久了,一直没有解决,在elasticsearch7.x版本的时候貌似好像可以用request在程序中来建立索引,像String index = “{ “mapping”:...}”之类的操作,干起来比较复杂,在elasticsearch8.x的版本中可以建立起一个实体类,使用@Field注解来说明每个字段的定义,但是这个注解无法处理suggest之类的自动补全查询,还好elasticsearch官方提供了class链接json文件的处理方式,可以解决注解的无法处理的问题。

下面是定义PostIndex相当于mybatisplus中的entity实体类,post-setting.json文件中可以定义分词器,例如简繁体、拼音分词器、同义词转换等等之类的分词器。

post-mapping.json文件中定义class对应elasticsearch的数据类型,可以定义fields用来做自动补全查询。

elasticsearch通过Java class类的@Setting和@Mapping来定义索引index_elasticsearch

PostIndex实体类

@Data
@Document(indexName = "post")
@Setting(settingPath = "json/post-setting.json")
@Mapping(mappingPath = "json/post-mapping.json")
public class PostIndex {
    private Long id;
    private Long postId;
    private String username;
    private String avatar;
    private String content;
    private Integer source;
    private Integer isShow;
    private Integer order;
    private String igUrl;
    private Date createTime;
    private Date updateTime;
    private Long userid;
    private List<String> tagsList;
    private List<String> postResourcesList;
    private String creator;
    private String updater;
    private Integer status;
    private Integer likes;

}

setting.json文件

{
  "analysis": {
    "analyzer": {
      "text_analyzer": {
        "filter": ["py"],
        "tokenizer": "ik_max_word",
        "char_filter": [
          "tsConvert"
        ]
      },
      "completion_analyzer": {
        "filter": ["tsConvert", "py"],
        "tokenizer": "keyword"
      },
      "tsConvert": {
        "tokenizer": "tsConvert"
      },
      "ikSearchAnalyzer": {
        "type": "custom",
        "tokenizer": "ik_max_word",
        "char_filter": [
          "tsConvert"
        ]
      }
    },
    "filter": {
      "py": {
        "type": "pinyin",
        "keep_full_pinyin": false,
        "keep_joined_full_pinyin": true,
        "keep_original": true,
        "limit_first_letter_length": 16,
        "remove_duplicated_term": true,
        "none_chinese_pinyin_tokenize": false
      },
      "tsConvert": {
        "convert_type": "t2s",
        "type": "stconvert",
        "keep_both": "false",
        "delimiter": "#"
      }
    },
    "char_filter": {
      "tsConvert": {
        "convert_type": "t2s",
        "type": "stconvert"
      }
    },
    "tokenizer": {
      "tsConvert": {
        "convert_type": "t2s",
        "type": "stconvert",
        "keep_both": "false",
        "delimiter": "#"
      }
    }
  }
}

mapping.json文件

{
  "properties": {
    "id": {
      "type": "long"
    },
    "avatar": {
      "type": "keyword"
    },
    "content": {
      "type": "text",
      "store": true,
      "analyzer": "text_analyzer",
      "search_analyzer": "ikSearchAnalyzer",
      "fields": {
        "suggest": {
          "type": "completion",
          "analyzer": "ik_max_word",
          "preserve_separators": true,
          "preserve_position_increments": true,
          "max_input_length": 50
        }
      }
    },
    "createTime": {
      "type": "date",
      "index": false,
      "store": true,
      "format": "date_optional_time",
      "ignore_malformed": true
    },
    "creator": {
      "type": "keyword",
      "store": true
    },
    "igUrl": {
      "type": "keyword"
    },
    "isShow": {
      "type": "integer",
      "index": false,
      "store": true
    },
    "postResourcesList": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "tagsList": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "likes": {
      "type": "keyword",
      "store": true
    },
    "order": {
      "type": "keyword"
    },
    "postId": {
      "type": "long"
    },
    "source": {
      "type": "integer",
      "index": false,
      "store": true
    },
    "status": {
      "type": "keyword",
      "store": true
    },
    "updateTime": {
      "type": "date",
      "index": false,
      "store": true,
      "format": "date_optional_time",
      "ignore_malformed": true
    },
    "updater": {
      "type": "keyword",
      "store": true
    },
    "userid": {
      "type": "keyword"
    },
    "username": {
      "type": "keyword",
      "store": true
    },
    "all": {
      "type": "text",
      "analyzer": "text_analyzer",
      "search_analyzer": "ikSearchAnalyzer"
    }
  }
}

标签:index,Java,keyword,type,Mapping,private,analyzer,true,store
From: https://blog.51cto.com/u_14725510/7852825

相关文章

  • 工厂方法模式--Java代码实现
    1、画类图2、Java代码实现其中可知,PWFactory、PW类均为接口类;并且,DESFactory、IDEAFactory类均要实现PWFactory接口;DES、IDEA类均要实现PW接口;具体代码如下://PWFactory.javapackageorg.example;publicinterfacePWFactory{publicPWcreateProduce();}//DE......
  • 恒生电子面试(java)
    感觉和学校学的很像,but做不出来具体的语法忘记了,毕竟是两年前学的。。。 第一次面,没事,加油 ......
  • java 警告 源发行版 17 需要目标发行版 17
    java:警告:源发行版17需要目标发行版17打开setting将两个位置都选为8(本人jdk版本)打开ProjectSettings都更改为自己的jdk的版本有的时候上图的Sources部分确实显示的是对的版本,但是后面的Dependencies却变成别的版本了,也一起改了对应......
  • 在JavaScript中如何检查数组是否包含某个值?
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中如何检查数组是否包含某个值?在JavaScript中,最简洁、高效的方法来检查数组是否包含某个值是什么?这是我所知的唯一方法:functioncontains(a,obj){for(vari=0;i<a.length;i++){if(a[i]===obj)......
  • 在JavaScript中,如何获取时间戳?
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中,如何获取时间戳?我想要一个单独的数字,代表当前的日期和时间,就像Unix时间戳一样。毫秒级时间戳要获取自Unix纪元以来的毫秒数,调用Date.now:Date.now()或者使用一元运算符+来调用Date.prototype.valueOf:+newDate......
  • Exception in thread "main" java.security.InvalidKeyException: Wrong key size问题
    问题描述在Java里面使用DES加密算法,然后就爆出这个错误:问题解决换用了另外一种加密解密的函数:SecretKeySpec;即将原来的这种:换成了这种:我是觉得使用DES加密算法时,它一直显示key的字节长度不对,就想着换一种表述方式,又看到了别的友友的经验分享,就换成这样试了试(直接放进mai......
  • java语言编码规范
    今天或者说这周突然意识到一个比较重要的问题,就是java语言的编码规范问题,于是整理了一部分的规范格式并且学习:类名要首字母大写,比如 SupplierService,PaymentOrderAction;不要 supplierService,paymentOrderAction.1.4 方法名首字母小写,如 addOrder() 不要 AddOrder()......
  • 2023.10.13 JavaScript DOM
    文档对象模型获取对象1.根据id属性值获取,返回单个对象varh1=document.getElementById('h1');2.根据标签名获取,返回对象数组vardivs=document.getElementByTagName('div');3.根据name属性值获取,返回对象数组varhobbys=document.getElementByName('hobby');4.根......
  • Java 知识 复习
    1.并发编程下面的程序需要导入java.util.concurrent.*1.1用户线程(四种方式)创建用户线程的方式有4种,分别是继承Thread类、实现Runnable接口、实现Callable接口、以及使用线程池。1.1.1继承自Thread类这种方式比较简单,通过继承Thread类,并重写run()方法。......
  • 能否翻译翻译,到底什么才叫“精通Java” ?
    01 模糊的岗位能力标准 技术类人员的招聘始终是令HR与技术面试官头疼的事。在一般招聘流程中,当确定了某个岗位招聘需求后,技术面试官会与HR一同商讨并明确该岗位的画像。明确画像后,一般HR会负责在招聘平台书写岗位JD,技术面试官则会准备相应的笔面试题目来考核岗位所要的能......