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

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

时间:2023-10-16 22:31:37浏览次数:39  
标签: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_analyzer

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/7894488

相关文章

  • 用java.net.URL类等访问HTTP服务器读取网页数据
    大力:“Java网络编程需要通过套接字去进行客户程序与服务器程序的交互,这种底层的通信实现起来比较麻烦,有没有现成的API呢?”卫琴:“JDK为基于HTTP协议的网络通信提供了协议处理框架API,Java客户程序通过它来访问HTTP服务器,会很方便。”本文以HTTP客户程序为例,介绍URL类和URLConnection......
  • Java String类
    1.substring()方法返回字符串的子字符串。publicStringsubstring(intbeginIndex)或publicStringsubstring(intbeginIndex,intendIndex)1classMain{2publicstaticvoidmain(String[]args){3Stringstr=newString("thismypractice");4......
  • Java中 length 和 length()的区别
    在Java中,str.length针对的是数组,而str.length()针对的是针对的字符串数组(str.length) 的特点有:长度固定,类型固定。因此数组的长度就可以被视为是一种数组的属性字符串(str.length()) :string的内部机制是一个char数组,而char数组有自己的长度属性,所以string就没必要......
  • java 获取月初的第一天
    一、背景点击查看代码SimpleDateFormatdf1=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Datedate=newDate();Dateda=newDate(date.getYear(),date.getMonth(),01);Timestamptimestamp=Timestamp.valueOf(df1.format(da......
  • 在Java中,如何避免检查空值?
    内容来自DOChttps://q.houxu6.top/?s=在Java中,如何避免检查空值?我使用x!=null来避免空指针异常。有没有其他的替代方法?if(x!=null){//...}在我看来,这是一个相对常见的问题,初级到中级的开发人员在某个时候都会遇到:他们要么不知道,要么不信任他们参与的合同,......
  • cpu在执行 java时,java指令是保存在数据cache中还是指令cache中
    Java代码在运行时,首先由JVM(JavaVirtualMachine)编译器将Java字节码转换成本地机器代码,然后再由CPU执行。在CPU中,指令缓存(InstructionCache)和数据缓存(DataCache)都是用于提高CPU处理效能的缓存结构,它们是处理器访问内存的缓存。对于生成的代码(或者说指令),它会被放入指令缓......
  • Java AbstractQueuedSynchronizer
    目录前言CLH锁AQS框架AQS核心思想AQS的同步状态AQS对资源的共享方式AQS的重要方法AQS的数据结构NodeConditionObjectConditionConditionObjectAQS源码分析核心方法acquire方法addWaiteracquireQueuereleaseAbstractQueuedSynchronizer总结前言Java中的大部分同步类,如L......
  • JavaSE基础07(集合)
    集合collection数组存放数据的弊端:数组定义后长度不可变;定义数组的类型不能变,数据只能存放指定类型的对象;解决数组存放的弊端方法:摒弃小数组,换一个更大的来存放(动态数组扩容);数组定义成Object,可以存放所有的类型;集合扩容在原来的基础上+>>1;System.arraycopy......
  • 2D物理引擎 Box2D for javascript Games 第四章 将力作用到刚体上
    2D物理引擎Box2DforjavascriptGames第四章将力作用到刚体上将力作用到刚体上Box2D是一个在力作用下的世界,它可以将力作用于刚体上,从而给我们一个更加真实的模拟。但是,如果你想要移动刚体,发射子弹,抛掷小鸟,驾驶汽车和当你在玩物理游戏时你看到的一切令人起劲的事情,那么你......
  • java.io.IOException: Could not find resource mapper/ProductCategoryMapper.xml 解
    java.io.IOException:Couldnotfindresourcemapper/ProductCategoryMapper.xml解决方案 一、问题背景通过MyBatisPlus测试达梦数据库过程中,运行测试类的时候,项目报错:“java.io.IOException:Couldnotfindresourcemapper/ProductCategoryMapper.xml”工程的目录......