Elasticsearch入门之java操作客户端

Elasticsearch入门之java操作客户端

一.创建Elasticsearch工程

导入pom文件

    <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.10</version>
        </dependency>

二.创建文档

1.默认方式创建索引

    @Test
    public void createIndex() throws Exception {
        //1.创建es客户端对象
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress
                        .getByName("127.0.0.1"), 9300));
        //2.创建文档内容
        XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
                .startObject()
                .field("id", 1)
                .field("title", "elasticsearch是一个基于lucene的搜索服务")
                .field("content", "ElasticSearch是一个基于Lucene的搜索服务器。\" +\n" +
                        "\"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。\" +\n" +
                        "\"Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,\" +\n" +
                        "\"是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,\" +\n" +
                        "\"可靠,快速,安装使用方便。")
                .endObject();
        //3.创建文档对象
        IndexResponse response = transportClient.prepareIndex("blog1", "article", "1")
                .setSource(contentBuilder)
                .get();
        //获取返回的状态
        RestStatus status = response.status();
        System.out.println(status);
        //4.释放资源
        transportClient.close();
    }

2.通过Map所以你的方式添加索引

 Map<String,Object> map = new HashMap<String, Object>();
        map.put("id","2");
        map.put("title","这是一个基于lucene的搜索服务");
        map.put("content","这是一个基于Lucene的搜索服务器文件");
        //3.创建文档对象
        IndexResponse response = transportClient.prepareIndex("blog1", "article", "2")
                .setSource(map)
                .get();

三.搜索文档数据

1.搜索所有的数据

//查询所有
    @Test
    public void searchAll() throws Exception{
        //1创建客户端对象
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).
                addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //2.构建搜索内容
        SearchResponse response = transportClient.prepareSearch("blog1").setTypes("article")
                .setQuery(QueryBuilders.matchAllQuery())
                .get();
 
 
        //获取搜索结果
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits());
        //遍历结果
        Iterator<SearchHit> iterator = hits.iterator();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        //关闭资源
        transportClient.close();
    }

2.字符串查询

   //字符串查询
    @Test
    public void StringSarech()throws Exception{
        //1.创建客户端对象
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //2.构建查询条件
        SearchResponse response = transportClient.prepareSearch("blog")
                .setTypes("article")
                .setQuery(QueryBuilders.queryStringQuery("这是"))
                .get();
        //获得查询结果
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits());
        Iterator<SearchHit> iterator = hits.iterator();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        //关闭资源
        transportClient.close();
    }

3.模糊查询

  //模糊查询
    @Test
    public void testWildCardSearch() throws Exception{
        //1.创建客户端对象
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //2.构建查询条件
        SearchResponse response = transportClient.prepareSearch("blog")
                .setTypes("article")
                .setQuery(QueryBuilders.wildcardQuery("title", "生成*"))
                .get();
        //获取结果
        SearchHits hits = response.getHits();
        System.out.println(hits.getTotalHits());
        Iterator<SearchHit> iterator = hits.iterator();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        //关闭资源
        transportClient.close();
    }

注意;在这我们没有进行中文分词所以查不到,所以我们必须集成IK分词器,才能进行模糊查询

4.词条查询

   //词条查询
    @Test
    public void testItemSearch()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //2.创建需要查询的词条
        SearchResponse response = transportClient.prepareSearch("blog1")
                .setTypes("article")
                .setQuery(QueryBuilders.termQuery("content", "搜索"))
                .get();
        //获得查询的结果
        SearchHits hits = response.getHits();
        System.out.println("查询结果有:"+hits.getTotalHits()+"条");
        Iterator<SearchHit> iterator = hits.iterator();
        for (SearchHit hit : hits) {
            SearchHit next = iterator.next();//每个查询对象
            System.out.println(hit.getSourceAsString());//获取字符串格式打印
            System.out.println("title:"+next.getSource().get("title"));
        }
        //4.释放资源
        transportClient.close();
    }

四.IK分词器与Elasticsearch集成

集成ik分词器的jar

启动es时出现这个就集成完毕
Elasticsearch入门之java操作客户端

IK分词器的介绍:

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,
IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的
中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对
Lucene的默认优化实现。
IK分词器3.0的特性如下:
1)采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。 2)采用了多子处理器分析模
式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词
汇(姓名、地名处理)等分词处理。 3)对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时
是支持个人词条的优化的词典存储,更小的内存占用。 4)支持用户词典扩展定义。 5)针对Lucene全文检索优化
的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命
中率

2. IK分词器测试

IK提供了两个分词算法ik_smart 和 ik_max_word
其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
我们分别来试一下
1)最小切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
输出的结果为:

Elasticsearch入门之java操作客户端

2)最细切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
Elasticsearch入门之java操作客户端


作者:wangwei_620
来源:CSDN
原文:https://blog.csdn.net/wangwei_620/article/details/86498241
版权声明:本文为博主原创文章,转载请附上博文链接!