注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】

自然语言处理系列四十七

Elasticsearch搜索引擎》Elasticsearch代码实战

上一篇文章详细Elasticsearch安装部署和使用,本篇文章将给一个Java调用Elasticsearch代码实战例子。

6. Elasticsearch的Java调用例子
首先添加最新或者你需要的版本Maven依赖如下,替换到x.x.x版本部分。

org.elasticsearch
elasticsearch
x.x.x


org.elasticsearch.client
transport
x.x.x

实现关键词进行相关度搜索的Java代码例子如12.1所示。
【代码12.1】 ESDemo.java

package com.chongdianleme.job;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by 充电了么App - 陈敬雷
 * 充电了么App官网:http://chongdianleme.com/
 * 充电了么App - 专注上班族职业技能提升充电学习的在线教育平台
 * Elasticsearch的Java代码调用演示
 */
public class ESDemo {
       private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      public static Client client = null;
      //获取客户端访问连接
      public static  Client getClient() {
         if(client!=null){
            return client;
         }
         Settings settings = Settings.builder().put("cluster.name", "chongdianleme-elasticsearch-application").build();
         try {
            client = new PreBuiltTransportClient(settings)
                  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.172.0.11"), 9300))
                  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.172.0.12"), 9300))
                  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.172.0.13"), 9300))
                  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.172.0.14"), 9300))
                  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.172.0.15"), 9300));
         } catch (UnknownHostException e) {
            e.printStackTrace();
         }
         return client;
      }
   /**
    * 添加搜索文档索引
    */
   public static String addIndex(String index,String type,Doc Doc){
      HashMap<String, Object> hashMap = new HashMap<String, Object>();
      hashMap.put("kcID", Doc.getKcID());
      hashMap.put("title", Doc.getTitle());
      hashMap.put("insertTime", Doc.getInsertTime());
      IndexResponse response = getClient().prepareIndex(index, type).setSource(hashMap).execute().actionGet();
      return response.getId();
   }
   /**
    * 按关键词key进行课程标题的相关度搜索及高亮显示
    * @return
    */
   public static Map<String, Object> search(String key,String index,String type,int start,int row){
      SearchRequestBuilder builder = getClient().prepareSearch(index);
      builder.setTypes(type);
      builder.setFrom(start);
      builder.setSize(row);
      //设置高亮字段名称
      builder.highlighter(new HighlightBuilder().field("userId"));
      builder.highlighter(new HighlightBuilder().field("key"));
      //设置高亮前缀
      builder.highlighter(new HighlightBuilder().preTags("<font color='red'>"));
      //设置高亮后缀
      builder.highlighter(new HighlightBuilder().postTags("</font>"));
      builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
      if(StringUtils.isNotBlank(key)){
         builder.setQuery(QueryBuilders.multiMatchQuery(key, "userId","key"));
      }
      builder.setExplain(true);
      SearchResponse searchResponse = builder.get();
      SearchHits hits = searchResponse.getHits();
      long total = hits.getTotalHits();
      Map<String, Object> map = new HashMap<String,Object>();
      SearchHit[] hits2 = hits.getHits();
      map.put("count", total);
      List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
      for (SearchHit searchHit : hits2) {
         Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
         HighlightField highlightField = highlightFields.get("userId");
         Map<String, Object> source = searchHit.getSource();
         if(highlightField!=null){
            Text[] fragments = highlightField.fragments();
            String name = "";
            for (Text text : fragments) {
               name+=text;
            }
            source.put("userId", name);
         }
         HighlightField highlightField2 = highlightFields.get("key");
         if(highlightField2!=null){
            Text[] fragments = highlightField2.fragments();
            String describe = "";
            for (Text text : fragments) {
               describe+=text;
            }
            source.put("key", key);
         }
         list.add(source);
      }
      map.put("dataList", list);
      return map;
   }
   public static void main(String[] args) {
      String insertTime = simpleDateFormat.format(new Date());
      Doc doc=new Doc("1","充电了么",insertTime);
      addIndex("test","tk",doc);
      Map<String, Object> search = ESDemo.search("充电了么", "test", "tk", 0, 36);
      List<Map<String, Object>> list = (List<Map<String, Object>>) search.get("dataList");
   }
}
class Doc {
   private String kcID;//课程ID
   private String title;//课程标题
   private String insertTime;//课程发布时间
   public Doc(String kcID, String title, String insertTime) {
      this.kcID = kcID;
      this.title = title;
      this.insertTime = insertTime;
   }
   public String getKcID() {
      return kcID;
   }
   public void setKcID(String kcID) {
      this.kcID = kcID;
   }
   public String getTitle() {
      return title;
   }
   public void setTitle(String title) {
      this.title = title;
   }
   public String getInsertTime() {
      return insertTime;
   }
   public void setInsertTime(String insertTime) {
      this.insertTime = insertTime;
   }
}

Word2vec词向量模型算法原理

下一篇文章详解Word2vec词向量模型算法原理,敬请关注。
更多的技术交流和探讨也欢迎加我个人微信chenjinglei66。

总结

此文章有对应的配套新书教材和视频:

【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。
全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。
本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。
《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目。

【配套视频】

推荐系统/智能问答/人脸识别实战 视频教程【陈敬雷】
视频特色:把目前互联网热门、前沿的项目实战汇聚一堂,通过真实的项目实战课程,让你快速成为算法总监、架构师、技术负责人!包含了推荐系统、智能问答、人脸识别等前沿的精品课程,下面分别介绍各个实战项目:
1、推荐算法系统实战
听完此课,可以实现一个完整的推荐系统!下面我们就从推荐系统的整体架构以及各个子系统的实现给大家深度解密来自一线大型互联网公司重量级的实战产品项目!
2、智能问答/对话机器人实战
由浅入深的给大家详细讲解对话机器人项目的原理以及代码实现、并在公司服务器上演示如何实际操作和部署的全过程!
3、人脸识别实战
从人脸识别原理、人脸识别应用场景、人脸检测与对齐、人脸识别比对、人脸年龄识别、人脸性别识别几个方向,从理论到源码实战、再到服务器操作给大家深度讲解!

自然语言处理NLP原理与实战 视频教程【陈敬雷】
视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!

人工智能《分布式机器学习实战》 视频教程【陈敬雷】
视频特色:视频核心内容有互联网公司大数据和人工智能、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)。

上一篇:自然语言处理系列四十六》Elasticsearch搜索引擎》Elasticsearch安装部署和使用
下一篇:自然语言处理系列四十八》Word2vec词向量模型》算法原理

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐