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. nginx mysql占用率高_nginx/mysql查看内存占用
  2. java facade dao_java – 在Facade模式中放置用于创建namedQuer...
  3. 面试官问:为什么String的hashCode选择 31 作为乘子?
  4. ATT汇编leave指令
  5. 使用springcloud gateway搭建网关(分流,限流,熔断)
  6. MyBatis Generator Example.Criteria 查询条件复制
  7. Git之签署工具GPG的安装和使用
  8. python进阶(十七)正则json(上)
  9. (CCPC 2020 网络选拔赛)HDU 6900 Residual Polynomial(分治 + NTT)
  10. 福建二级计算机考试12,福建农林大学2016年12月计算机二级考试通知
  11. avast高级版许可文件_明道云私有部署版已上架腾讯云镜像市场
  12. 展讯模块读写IMEI
  13. ue4账号注册不了_UE4入门(一)软件安装教程
  14. 软件测试的八股文内容
  15. 【Excel】Excel条件格式设置背景色
  16. 精打视频教程(10)菜鸟电子面单打印与发货
  17. Linux 用户账号安全管理,文件系统和日志
  18. python 编程题 有n个整数、使其前面各数_有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数。...
  19. Python Couldn‘t find any class folder
  20. html 网页背景图片根据屏幕大小CSS自动缩放

热门文章

  1. Citation Gecko论文检索神器
  2. 数字信号处理中的 SIMD
  3. vux flexbox使用_指南针与Flexbox结合使用入门
  4. Windows10下Vmware开机蓝屏解决办法,亲测有效
  5. Linux命令,未完待续。。。
  6. 【玩转华为云】手把手教你利用ModelArts实现数据集的图像标注
  7. 黑色白色文字阴影HTML,利用css3的text-shadow属性实现文字阴影乳白效果
  8. VMware15内安装Ubuntu20.04系统教程
  9. BurpSuite—-Scanner模块(漏洞扫描)
  10. 玻璃破碎玻璃破碎机玻璃回收厂