美文网首页
166Elasticsearch 基础入门--开发elastic

166Elasticsearch 基础入门--开发elastic

作者: Jachin111 | 来源:发表于2021-09-25 11:52 被阅读0次

    elasticsearch 简介

    不了解 elasticsearch 的人都以为 Es 只能进行模糊搜索,其实不仅能进行模糊搜索还能进行全匹配搜索。在集群模式 elasticsearch 的搜索把多个节点的数据汇集到一个节点最终显示给调用端,索引数据必须指定_index(database)及 index 下面的 type(table)。

    查询 elasticsearch 全部数据

    java 查询 elasticsearch 全部数据
    1.确保启动 es 服务 2.打开浏览器访问http://127.0.0.1:9200/_plugin/head 查看我们上节课创建的 userInfo。

    image.png
    在com.syl.es下新建 QueryData1 类
    image.png
    编写搜索全部数据的函数
    package com.syl.es;
    
    import java.net.InetAddress;
    
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.Client;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.MatchQueryBuilder;
    import org.elasticsearch.index.query.MatchQueryBuilder.Operator;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHits;
    
    public class QueryData1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //调用搜索全部数据方法
            searchAll();
        }
        /**
         * 搜索全部数据
         */
        public static void searchAll(){
            //索引服务的地址
            String elasticServer= "127.0.0.1";
            //索引服务的端口
            Integer elasticServerPort = 9300;
            Client client=null;
            try{
                //初始化连接
                Settings settings = Settings.settingsBuilder().build();
                client = TransportClient.builder().settings(settings).build()
                         .addTransportAddress(new InetSocketTransportAddress(
                                 InetAddress.getByName(elasticServer), elasticServerPort));
                //搜索全部数据
                QueryBuilder  bqb=QueryBuilders.matchAllQuery();
                System.out.println(bqb.toString()+"====================");
                SearchResponse response = client.prepareSearch("user").setTypes("userInfo") //set index set type
                        .setQuery(bqb.toString())
                        .execute()
                        .actionGet();
                SearchHits hits = response.getHits();
                System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
                for (int i = 0; i < hits.getHits().length; i++) {
                    System.out.println("===searchAll()====="+hits.getAt(i).getId()+"-------"
                            + "------"+hits.getAt(i).getSource());
                }
                //关闭连接
                client.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    QueryBuilders.matchAllQuery() 代表查询全部数据。
    client.prepareSearch("user").setTypes("userInfo")代表查询 user 索引的 userInfo
    type(一个 index 索引下可以有多个 type,所以要指定某个 type)。
    setQuery(bqb.toString()) 代表设置查询的条件

    以 Java Application 的方式,运行QueryData1.java文件。
    查看执行结果

    image.png

    查询 elasticsearch 部分数据

    编写 searchSize 方法
    在QueryData1.java,添加函数 searchSize

        /**
         * 搜索指定数量数据
         */
        public static void searchSize(){
            //索引服务的地址
            String elasticServer= "127.0.0.1";
            //索引服务的端口
            Integer elasticServerPort = 9300;
            Client client=null;
            try{
                //初始化连接
                Settings settings = Settings.settingsBuilder().build();
                client = TransportClient.builder().settings(settings).build()
                         .addTransportAddress(new InetSocketTransportAddress(
                                 InetAddress.getByName(elasticServer), elasticServerPort));
                //搜索数据
                QueryBuilder  bqb=QueryBuilders.matchAllQuery();
                SearchResponse response = client.prepareSearch("user").setTypes("userInfo")
                        .setQuery(bqb.toString())
                        .setFrom(0).setSize(2)//设置条数
                        .execute()
                        .actionGet();
                SearchHits hits = response.getHits();
                System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
                //打印搜索结果
                for (int i = 0; i < hits.getHits().length; i++) {
                    System.out.println("====searchSize()==="+hits.getAt(i).getId()+"------"
                            + "-------"+hits.getAt(i).getSource());
                }
                //关闭连接
                client.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    setFrom(0).setSize(2) 代表从开始查询返回 2 条数据。
    修改主函数,调用删除索引函数
    注释掉 searchAll() 的调用,增加调用 searchSize()。

     public static void main(String[] args) {
            //searchAll();
            searchSize();
        }
    

    运行代码
    以 Java Application 的方式,运行QueryData1.java文件。
    查看运行结果

    image.png

    模糊搜索 elasticsearch 数据

    编写 searchMatchQuery 方法
    在QueryData1.java,添加函数 searchMatchQuery

        /**
         * 模糊搜索索引数据
         */
        public static void searchMatchQuery(){
            //索引服务的地址
            String elasticServer= "127.0.0.1";
            //索引服务的端口
            Integer elasticServerPort = 9300;
            Client client=null;
            try{
                //初始化连接
                Settings settings = Settings.settingsBuilder().build();
                client = TransportClient.builder().settings(settings).build()
                         .addTransportAddress(new InetSocketTransportAddress(
                                 InetAddress.getByName(elasticServer), elasticServerPort));
                //设置查询条件
                BoolQueryBuilder bqb=QueryBuilders.boolQuery();
                float BOOST = (float) 1.2;
                MatchQueryBuilder titleSearchBuilder = QueryBuilders.matchQuery("name", "张中国");
                titleSearchBuilder.boost(BOOST);
                titleSearchBuilder.operator(Operator.AND);
                bqb.must(titleSearchBuilder);
                //模糊搜索数据
                SearchResponse response = client.prepareSearch("user").setTypes("userInfo")
                        .setQuery(bqb.toString())
                        .setFrom(0).setSize(60).setExplain(true) //setExplain 按查询匹配度排序
                        .execute()
                        .actionGet();
                SearchHits hits = response.getHits();
                System.out.println(hits.getTotalHits() +" "+ hits.getHits().length);
                //打印搜索结果
                for (int i = 0; i < hits.getHits().length; i++) {
                    System.out.println("===searchMatchQuery()==="+hits.getAt(i).getId()+"--" +
                            "-----------"+hits.getAt(i).getSource());
                }
                //关闭连接
                client.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }
    

    修改主函数,调用删除索引函数
    注释掉 searchSize()的调用,增加调用 searchMatchQuery。

     public static void main(String[] args) {
            //搜索全部数据
            //searchAll();
            //搜索指定数量数据
            //searchSize();
            //模糊搜索
              searchMatchQuery();
        }
    

    运行代码
    以 Java Application 的方式,运行QueryData1.java文件。
    查看运行结果

    image.png
    运行发现 3 条数据都查询出来了。
    拓展:大家可以把搜索关键词换成中国试试能否搜索出来,在换成中看能否搜索出来。

    相关文章

      网友评论

          本文标题:166Elasticsearch 基础入门--开发elastic

          本文链接:https://www.haomeiwen.com/subject/bfkxnltx.html