ElasticSearch编程

  • 创建测试项目,导包
  • 创建索引
  • 创建映射mapping
  • 建立文档操作
    • 建立文档1--通过XContentBuilder
    • 建立文档2--通过Jackson转换实体
  • 查询文档操作
    • TermQuery
    • QueryString
    • MatchQuery
    • 查询后分页
    • 使用文档id查询
    • 查询结果高亮操作

创建测试项目,导包

创建一个maven项目,导入ElasticSearch相关包

    <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId><version>2.9.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.24</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.21</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

创建索引

    @Test//创建索引public void createIndex() throws Exception{//1.设置加入的集群Settings settings = Settings.builder().put("cluster.name","my-elasticsearch").build();//2.创建client连接对象TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.111.129"),9300));//3.创建名称为blog2的索引client.admin().indices().prepareCreate("blog2").get();//4.释放资源client.close();}

运行结果可以在elasticsearch-head-master中看到

创建映射mapping

因为无论创建索引还是mapping,以及之后的创建数据和查询操作都需要创建client连接对象,所以我们将其封装成一个单独的方法。此处注解Before的作用为在点击运行test之前都会限制行一遍getTransportClient()方法

    TransportClient client ;@Beforepublic void getTransportClient() throws UnknownHostException {Settings settings = Settings.builder().put("cluster.name","my-elasticsearch").build();client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.111.129"), 9300));}

创建映射

    @Test//创建映射public void createMappings() throws Exception {//添加映射/**"mappings": {"article": {"properties": {"id": {"store": true,"type": "integer"},"title": {"analyzer": "ik_smart","store": true,"type": "text"},"content": {"analyzer": "ik_smart","store": true,"type": "text"}}}}*/XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("article").startObject("properties").startObject("id").field("type","integer").field("store","yes").endObject().startObject("title").field("type","string").field("store","yes").field("analyzer","ik_smart").endObject().startObject("content").field("type","string").field("store","yes").field("analyzer","ik_smart").endObject().endObject().endObject().endObject();//创建映射PutMappingRequest mapping = Requests.putMappingRequest("blog2").type("article").source(builder);client.admin().indices().putMapping(mapping).get();//释放资源client.close();}

运行后可以在elasticsearch-head-master中看到

建立文档操作

建立文档1–通过XContentBuilder

此处要注意id格式默认为长整型

    @Test//建立文档--通过XContentBuilderpublic void  createDoc() throws Exception{//创建client对象//创建一个文档对象XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("id", 2L).field("title","桂林大暴雨").field("content","桂林下雨了!桂林又下雨了!").endObject();//把文档对象添加到索引库client.prepareIndex()//设置索引名称.setIndex("blog2")//设置type.setType("article")//设置文档的id,如果不设置的话自动生成一个id.setId("2")//设置文档信息.setSource(builder)//执行操作.get();//关闭客户端client.close();}

可以在elasticsearch-head-master中看到

建立文档2–通过Jackson转换实体

字面意思通过传入对象的方式创建文档
首先创建Article实体类


public class Article {private long id;private String title;private String content;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

然后使⽤Jackson转换实体

    @Test//创建文档第二种方式--通过ackson转换实体public void createDoc2() throws Exception{//创建一个Article对象Article article = new Article();//设置对象的属性article.setId(3);article.setTitle("桂林大暴雪");article.setContent("这是不可能的!这是不可能的!");//把article对象转换成json格式的字符串ObjectMapper objectMapper = new ObjectMapper();String jsonDocument = objectMapper.writeValueAsString(article);System.out.println(jsonDocument);//使用client对象把文档写入索引库client.prepareIndex("blog2","article","3").setSource(jsonDocument, XContentType.JSON).get();//关闭客户端}

同样可以在elasticsearch-head-master中看到,文档同样创建成功

查询文档操作

TermQuery

TermQuery:对搜索的关键词不分词

 @Test//termQuery查询public void testQueryByTerm() throws Exception{//创建一个QueryBuilder对象//参数1:要搜索的字段//参数2:要搜索的关键词QueryBuilder queryBuilder = QueryBuilders.termQuery("title","桂林暴雪");//执行查询SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(queryBuilder).get();//得到查询结果SearchHits searchHits = searchResponse.getHits();//取查询结果的总记录数System.out.println("查询结果总记录数:"+searchHits.getTotalHits());//查询结果列表Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit searchHit = iterator.next();//打印⽂档对象,以json格式输出System.out.println(searchHit.getSourceAsString());//取⽂档的属性System.out.println("-----------⽂档的属性-----------");Map<String, Object> document = searchHit.getSource();System.out.println(document.get("id"));System.out.println(document.get("title"));System.out.println(document.get("content"));}//关闭clientclient.close();}

QueryString

query_string:搜索之前对搜索的关键词分词,搜索结果取决于分词器

@Testpublic void testQueryByQueryString() throws Exception {//创建⼀个QueryBuilder对象//参数1:要搜索的字段//参数2:要搜索的关键词QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("桂林暴雪").defaultField("title");//执⾏查询SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(queryBuilder).get();//取查询结果SearchHits searchHits = searchResponse.getHits();//取查询结果的总记录数System.out.println("查询结果总记录数:" + searchHits.getTotalHits());//查询结果列表Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit searchHit = iterator.next();//打印⽂档对象,以json格式输出System.out.println(searchHit.getSourceAsString());//取⽂档的属性System.out.println("-----------⽂档的属性-----------");Map<String, Object> document = searchHit.getSource();System.out.println(document.get("id"));System.out.println(document.get("title"));System.out.println(document.get("content"));}//关闭clientclient.close();}

MatchQuery

match查询时,对查询字符串会进行分词处理。

 @Testpublic void testQueryByMatchQuery() throws Exception {//创建⼀个QueryBuilder对象//参数1:要搜索的字段//参数2:要搜索的关键词QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "桂暴雪");//执⾏查询SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(queryBuilder).get();//取查询结果SearchHits searchHits = searchResponse.getHits();//取查询结果的总记录数System.out.println("查询结果总记录数:" + searchHits.getTotalHits());//查询结果列表Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit searchHit = iterator.next();//打印⽂档对象,以json格式输出System.out.println(searchHit.getSourceAsString());//取⽂档的属性System.out.println("-----------⽂档的属性-----------");Map<String, Object> document = searchHit.getSource();System.out.println(document.get("id"));System.out.println(document.get("title"));System.out.println(document.get("content"));}//关闭clientclient.close();}

查询后分页

 //查询后分页方法private void search(QueryBuilder queryBuilder) throws Exception {//执⾏查询SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(queryBuilder)//设置分⻚信息.setFrom(0)//每⻚显示的⾏数.setSize(5).get();//取查询结果SearchHits searchHits = searchResponse.getHits();//取查询结果的总记录数System.out.println("查询结果总记录数:" + searchHits.getTotalHits());//查询结果列表Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit searchHit = iterator.next();//打印⽂档对象,以json格式输出System.out.println(searchHit.getSourceAsString());//取⽂档的属性System.out.println("-----------⽂档的属性");Map<String, Object> document = searchHit.getSource();System.out.println(document.get("id"));System.out.println(document.get("title"));System.out.println(document.get("content"));}//关闭clientclient.close();}

使用文档id查询

//使用文档ID查询文档@Testpublic void testSearchById() throws Exception {//创建⼀个client对象//创建⼀个查询对象QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("2", "3");search(queryBuilder);}

查询结果高亮操作

比如在京东商城搜索“笔记本”

通过开发者⼯具查看⾼亮数据的html代码实现:

ElasticSearch可以对查询出的内容中关键字部分进⾏标签和样式的设置,但是你需要告诉ElasticSearch
使⽤什么标签对⾼亮关键字进⾏包裹

代码实现如下:

//高亮代码实现@Testpublic void highlightSearchTest() throws Exception {QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("桂林", "title", "content");HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("title").field("content");highlightBuilder.preTags("<em>");highlightBuilder.postTags("</em>");//执⾏查询SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(queryBuilder)//设置⾼亮信息.highlighter(highlightBuilder).get();//取查询结果SearchHits searchHits = searchResponse.getHits();//取查询结果的总记录数System.out.println("查询结果总记录数:" + searchHits.getTotalHits());//查询结果列表Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit searchHit = iterator.next();//取⽂档的属性System.out.println("-----------⽂档的属性-----------");Map<String, Object> document = searchHit.getSource();System.out.println(document.get("id"));System.out.println(document.get("title"));System.out.println(document.get("content"));System.out.println("************高亮结果************");Map<String, HighlightField> highlightFields =searchHit.getHighlightFields();//取title⾼亮显示的结果if (highlightFields.size() <=0) continue;for (Map.Entry<String, HighlightField> entry :highlightFields.entrySet()) {System.out.println(entry.getKey() + ":\t" +Arrays.toString(entry.getValue().getFragments()));}}//关闭clientclient.close();}

查询结果如下

ElasticSearch编程--基本的创建与查询操作相关推荐

  1. 【DM】达梦数据库中分区表的创建及查询操作

    文章目录 一.摘要 二.演示 范围分区表 LIST分区表 哈希分区表 多级分区表 一.摘要 达梦数据库对表是进行水平分区的:水平分区的方式有以下几种: 范围分区表 LIST分区表 哈希分区表 多级分区 ...

  2. 使用SharePoint Server 2007搜索对象模型编程创建搜索查询

    MOSS Visual How To 使用SharePoint Server 2007搜索对象模型编程创建搜索查询 摘要:学习如何使用Microsoft Office SharePoint Serve ...

  3. 31-32 python mysql-connector创建数据、crud,where,排序,删除等。PyMSQL驱动,插入操作、查询操作、更新操作、删除操作、执行

    31Python MysSQL - mysql-connector驱动 使用pip命令安装mysql-connector: python -m pip install mysql-connector ...

  4. python界面设置-PYTHON图形化操作界面的编程七__创建菜单

    PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...

  5. python函数做菜单_PYTHON图形化操作界面的编程七__创建菜单

    PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...

  6. 【SQL数据库】数据库的创建、查询、插入等操作使用方法(结合黑皮书教材网站(db-book中的例子)在MySQL Workbench和shell中实现查询操作

    SQL 数据库的创建.查询.插入等操作使用方法(结合黑皮书教材网站中的例子) 注:数据来源: https://www.db-book.com/university-lab-dir/sample_tab ...

  7. 【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

    这篇文章,主要介绍ElasticSearch数据库之查询操作(match.must.must_not.should._source.filter.range.exists.ids.term.terms ...

  8. (Java数据库编程基础操作)Statement实现数据查询操作

    Statement实现数据查询操作 在整个数据库的开发过程之中数据的查询操作是最复杂的,因为查询会牵扯到各种复杂查询的管理,例如:多表查询.子查询.统计查询.集合操作等等,但是从现代的开发来讲,对于数 ...

  9. c 编程 mysql结果集_使用mysql C语言API编写程序—MYSQL数据库查询操作(执行查询操作,获取查询结果的字段数,记录行数,...

    //MYSQL_RES保存查询结构 MYSQL_RES* result_ = NULL; int error_code = 0; //保存错误码 char error_info[1024] = '\0 ...

最新文章

  1. 之全能忙内_临沧大名山茶:喝过诸多忙肺茶,但你不知道什么是“隔年香”
  2. XHTML行内描述性元素(持续更新中)
  3. 让表单文本框只读不可编辑的方法
  4. iOS中的图像处理(一)——基础滤镜
  5. stm32f4 hs 电路_电动机控制电路识图一看就懂
  6. python3.6串口编程实例_使用python3实现操作串口详解
  7. 项目管理实践之版本控制工具SVN
  8. java 计数程序_Java JVM——4.程序计数器
  9. .so 依赖目录 cmake_Android Studio 生成 so 文件
  10. JAVA日常游玩-----用EnumMap优化代码。
  11. Grub 启动时的 Error 13: Invalid or unsupported executable 问题的解决
  12. Android6.0源码下载
  13. 14届数独-真题标准数独-Day 9-20220124
  14. 计算机怎么关闭u盘系统还原,电脑系统还原错误怎么办
  15. 如何读取或转换PCD点云文件
  16. H264和aac 封装成为ts,并生成m3u8
  17. HTML学生个人网站作业设计——HTML+CSS+JavaScript优分期大学生分期购物商城(7页)
  18. [Photography] 新摄影笔记
  19. PPT中正文和标题字体的选择技巧
  20. 计算机视觉实战----AlexNet网络及使用colab跑YoloV5代码

热门文章

  1. 广交会展会汇信快速报价小程序
  2. Android中级面筋:开发2年的程序员如何短期突击面试?跟着这几步去准备
  3. 学术工具-文献引文分析利器之 HistCite
  4. 智能合约开发 Ganache | Truffle | Solidity | Web3.js
  5. JS+Position实现类接元宝游戏
  6. win10系统发现无法对硬盘进行Bitlocker加密踩坑!
  7. 【正一专栏】榆林产妇和程序员苏享茂怎样你们都不该去死
  8. java计算机毕业设计中小学教务管理平台源码+mysql数据库+系统+部署+lw文档
  9. 亚马逊关联视频:如何成为影响者视频行业的重要一环?
  10. JS 返回两个时间之间的所有日期、月份、年份、季度