• SpringMVC项目使用elastic search搜索


    项目需要,引入了elastic search(后续简称es),后面将介绍本地对es的安装,使用以及java连接es查询的整个过程。

    1、es索引字段建立与修改,以curl新增一个索引字段示例

    curl -X PUT 
      http://127.0.0.1:9200/idx_your_entity/_mapping/your_entity 
      -H 'Content-Type: application/json' 
      -H 'Postman-Token: 326dd921-4f7e-498b-866a-2de5173a908f' 
      -H 'cache-control: no-cache' 
      -d '{
        "properties": {
           "is_enable":{
                "type":"integer"
            }
        }
    }

    2、使用logstash向es里面增量推数据,需要有update_date字段

    input {
        jdbc {
            jdbc_driver_library => "D:/logstash-6.7.1/lib/sqljdbc4.jar"
            jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
            jdbc_connection_string => "jdbc:sqlserver://database_link;DatabaseName=HIM_bak;"
            jdbc_user => "username"
            jdbc_password => "password"
            schedule => "* * * * *"
            jdbc_default_timezone => "Asia/Shanghai"
    		use_column_value => false
    		tracking_column => "update_date"
            statement => "select 
    			[fields you need] 
    			from table WHERE update_date > :sql_last_value"
        }
    }
    output {
        elasticsearch {
            index => "idx_workhelp"
            document_type => "workhelp"
            document_id => "%{helpno}"
            hosts => ["127.0.0.1:9200"]
        }
    }
    

    3、es查询jar包,pom配置

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
        <version>6.7.1</version>
    </dependency>
    

    4、es数据源,查询client配置

    @Bean
    public TransportClient client() throws Exception {
        // init client
        TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), port);
        Settings settings = Settings.builder().put("cluster.name", nodeName).build();
        client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(transportAddress);
        logger.info("use es and elastic search connect successful");
        return client;
    }

    5、es查询条件的构建:这里介绍两种查询条件的构建,must表示且,should表示或;同时用到了两种匹配方式:termQuery代表完全匹配,配合索引类型 keywords 使用,matchQuery代表模糊匹配,配合text使用。

     BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
     //示例 A=a and B like %b% and (C like %c% or D like %d%)
     boolQueryBuilder.filter(QueryBuilders.termQuery(fieldA, a));
     boolQueryBuilder.must(QueryBuilders.matchQuery(fieldB, b));
     boolQueryBuilder.must(
                        QueryBuilders.boolQuery()
                        .should(QueryBuilders.matchQuery(fieldC, c))
                        .should(QueryBuilders.matchQuery(fieldD, d)));

    6、设置关键词高亮显示

    highlightBuilder.preTags("<span class='highLight'>");
    highlightBuilder.postTags("</span>");
    highlightBuilder.field(field);

    7、把条件带入并且执行查询,hits即查询结构,需要的数据类型SearchHits结构不复杂,这里不再赘叙。

    SearchRequestBuilder searchRequestBuilder = client
        .prepareSearch(INDEX)
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(boolQueryBuilder);
    searchRequestBuilder.highlighter(problemDescHiBuilder);
    // 分页
    searchRequestBuilder.setFrom(startIndex);
    searchRequestBuilder.setSize(pageSize);
    // 排序
    searchRequestBuilder
        .addSort(SortBuilders.fieldSort(CREATEDATE))
        .addSort(SortBuilders.fieldSort(READCOUNT)
        .order(SortOrder.DESC));
    SearchResponse response = searchRequestBuilder.get();
    SearchHits hits = searchRequestBuilder.get().getHits();

    8、查询结果。查询结果即对SearchHits进行处理,转化为自己项目的视图对象,一般为 业务实体VO 的命名方式进行表达,传到控制层。

    9、最后:写到这里,大家有问题可以联系我共同学习探讨~

  • 相关阅读:
    [LeetCode]Word Break
    [LeetCode]singleNumber
    [LeetCode]Palindrome
    新浪博客无法访问
    C++基础之顺序容器
    C++基础之IO类
    [LeetCode]Restore IP Addresses
    [LeetCode]Maximal Rectangle
    [LeetCode]Reverse Linked List II
    ACM 树形数组
  • 原文地址:https://www.cnblogs.com/tuofan/p/10955736.html
Copyright © 2020-2023  润新知