Elasticsearch 带中文分词的全文检索(分页+高亮返回)

2023-10-28

一.全文搜索介绍

Full text queries 全文搜索主要有以下几种类型:

1.1 匹配查询(match query)

QueryBuilder qb = matchQuery( 
   "name",                  //field 字段    
   "kimchy elasticsearch"   // text 
);

DSL 查询语句:

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

1.2 多字段查询(multi_match query)

可以用来对多个字段的版本进行匹配查询

QueryBuilder qb = multiMatchQuery(   
 "kimchy elasticsearch", //text   
 "user", "message"       //fields 多个字段
);

DSL查询语句:

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", 
      "fields": [ "subject", "message" ] 
    }
  }
}

1.3 常用术语查询(common_terms query)

可以对一些比较专业的偏门词语进行的更加专业的查询

QueryBuilder qb = commonTermsQuery(
"name",    //field 字段  
"kimchy");  // value

DSL查询语句:

GET /_search
{
    "query": {
        "common": {
            "body": {
                "query": "this is bonsai cool",
                "cutoff_frequency": 0.001
            }
        }
    }
}

1.4 查询语句查询(query_string query)

       与lucene查询语句的语法结合的更加紧密的一种查询,允许你在一个查询语句中使用多个特殊条件关键字(如:AND|OR|NOT )对多个字段进行查询,这种查询仅限专家用户去使用。

QueryBuilder qb = queryStringQuery("+kimchy -elasticsearch");    //text

DSL查询语句:

GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}

        以上四种是全文搜索可以用到的查询方式,但是一般使用多字段查询(multi_match query)比较多,这里重点写下第二种方式的使用。

二.使用multi_match query的方式实现全文多字段的匹配查询

2.1 检索服务

实现一个关键字分词匹配多个字段,分页查询,命中字段高亮显示

private <T> SearchDto<T> getResult(ShipQueryDto shipQueryDto, String indexName, Class<T> clazz) throws IOException, IllegalAccessException {
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        /* 高亮查询 */
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.numOfFragments(0); /*长度*/
        highlightBuilder.preTags("<span style='color:red;'>");
        highlightBuilder.postTags("</span>");
        highlightBuilder.highlighterType("plain");
        for (String name : EsSmartIndexHelper.classMapMap.get(clazz).keySet()) {
            highlightBuilder.field(name).requireFieldMatch(false);
        }
        sourceBuilder.highlighter(highlightBuilder);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if(StringUtils.isNotEmpty(shipQueryDto.getKeys())){
            boolQueryBuilder.must(QueryBuilders.multiMatchQuery(shipQueryDto.getKeys()).fields(EsSmartIndexHelper.classMapMap.get(clazz)).type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
//                    .minimumShouldMatch("70%")
                            //使用最细粒度分词搜索
                            .analyzer("ik_max_word").operator(Operator.OR)
            );
        }
        sourceBuilder.query(boolQueryBuilder);

        // 分页
        Integer from = (shipQueryDto.getPageNum()-1) * shipQueryDto.getPageSize();
        sourceBuilder.from(from);
        sourceBuilder.size(shipQueryDto.getPageSize());
        sourceBuilder.trackTotalHits(true);
        searchRequest.source(sourceBuilder);
        log.error("查询的DSL语句: " + searchRequest.source().toString());
        SearchResponse searchRes = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        log.error("返回原始数据 : " + searchRes);
        SearchHit[] hits = searchRes.getHits().getHits();
        List<T> searchShipCbgkDtos = new ArrayList<>();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            T shipDto = JSONObject.parseObject(json, clazz);
            //获取高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(CollectionUtil.isNotEmpty(highlightFields)){
                //获取class子类的字段
                Field[] fields =clazz.getDeclaredFields();
                //获取class继承父类的字段
                Field[] fields1 = clazz.getSuperclass().getDeclaredFields();
                //字段高亮处理
                for (Field field : fields1) {
                    field.setAccessible(true);
                    if (highlightFields.containsKey(field.getName())){
                        HighlightField highlightField = highlightFields.get(field.getName());
                        Text[] fragments = highlightField.fragments();
                        StringBuilder text = new StringBuilder();
                        for (Text fragment : fragments) {
                            text.append(fragment.toString());
                        }
                        field.set(shipDto, text.toString());
                    }
                }
                for (Field field : fields) {
                    field.setAccessible(true);
                    if (highlightFields.containsKey(field.getName())){
                        HighlightField highlightField = highlightFields.get(field.getName());
                        Text[] fragments = highlightField.fragments();
                        StringBuilder text = new StringBuilder();
                        for (Text fragment : fragments) {
                            text.append(fragment.toString());
                        }
                        field.set(shipDto, text.toString());
                    }
                }
            }
            searchShipCbgkDtos.add(shipDto);
        }
        SearchDto<T> searchDto = new SearchDto<>();
        searchDto.setTotal(searchRes.getHits().getTotalHits().value);
        searchDto.setSearchShips(searchShipCbgkDtos);
        return searchDto;
    }



@Override
    public SearchDto<SearchShipCbgkDto> searchShip(ShipQueryDto shipQueryDto) throws IOException, IllegalAccessException {
        return getResult(shipQueryDto, EsIndex.INDEX_SEAT_SEARCH_SHIP_CBGK.getStatus(), SearchShipCbgkDto.class);
    }
import lombok.Data;

import java.util.List;

/**
 * 搜索返回实体
 * @param <T>
 */
@Data
public class SearchDto<T> {

    /** 该库数量 */
    private Long total;

    /** 该库返回列表 */
    private List<T> searchShips;
}
import java.util.HashMap;
import java.util.Map;

/**
 * 全文搜索匹配的字段和权重
 */
public class EsSmartIndexHelper {

    public static Map<String, Float> shipCbgkfields = new HashMap<String, Float>();

    public static HashMap<Class<? extends BaseSearchDto>, Map<String, Float>> classMapMap = new HashMap<Class<? extends BaseSearchDto>, Map<String, Float>>();

    static {
        //船舶库
        classMapMap.put(SearchShipCbgkDto.class, shipCbgkfields);
        shipCbgkfields.put("shipName", 2.5f);
        //            "shipId",
        shipCbgkfields.put("shipRegistryPort", 1.8f);
        //            "shipOwnerId",
        shipCbgkfields.put("shipOwnerName", 1.5f);
        shipCbgkfields.put("shipOwnerSex", 1f);
        shipCbgkfields.put("shipOwnerTel", 1f);
        shipCbgkfields.put("shipOwnerIdNumber", 1.1f);
        shipCbgkfields.put("deptId", 1f);

        shipCbgkfields.put("createTime", 1f);
        shipCbgkfields.put("bdsTerminalNo", 1.3f);
        shipCbgkfields.put("mmsi", 1.3f);
    }
}

2.2 检索的DSL语句

Get       /index/queryShip?keys=琼海口渔&pageNum=1&pageSize=10
GET index_test_search_ship/_search
{
  "from": 0,
	"size": 20,
	"query": {
		"bool": {
			"must": [{
				"multi_match": {
					"query": "琼海口渔",
					"fields": ["bdsTerminalNo^1.3", "createTime^1.0", "deptId^1.0", "mmsi^1.3", "shipName^2.5", "shipOwnerIdNumber^1.1", "shipOwnerName^1.5", "shipOwnerSex^1.0", "shipOwnerTel^1.0", "shipRegistryPort^1.8"],
					"type": "cross_fields",
					"operator": "OR",
					"analyzer": "ik_max_word",
					"slop": 0,
					"prefix_length": 0,
					"max_expansions": 50,
					"zero_terms_query": "NONE",
					"auto_generate_synonyms_phrase_query": true,
					"fuzzy_transpositions": true,
					"boost": 1.0
				}
			}],
			"adjust_pure_negative": true,
			"boost": 1.0
		}
	},
	"track_total_hits": 2147483647,
	"highlight": {
		"pre_tags": ["<span style='color:red;'>"],
		"post_tags": ["</span>"],
		"number_of_fragments": 0,
		"type": "plain",
		"require_field_match": false,
		"fields": {
			"shipOwnerName": {},
			"shipOwnerTel": {},
			"createTime": {},
			"mmsi": {},
			"bdsTerminalNo": {},
			"deptId": {},
			"shipName": {},
			"shipOwnerSex": {},
			"shipOwnerIdNumber": {},
			"shipRegistryPort": {}
		}
	}
}

2.3 返回的原始JSON数据

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 20,
      "relation" : "eq"
    },
    "max_score" : 7.7624564,
    "hits" : [
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "bpMhcYQB4gQEvltnaqX-",
        "_score" : 7.7624564,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "b5MhcYQB4gQEvltnbaUM",
        "_score" : 7.7624564,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "U5PBb4QB4gQEvltnIKV-",
        "_score" : 7.0790462,
        "_source" : {
          "shipId" : "01",
          "shipName" : "013234琼海口渔",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "013234<span style='color:red;'>琼海口渔</span>"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "VJPEb4QB4gQEvltnm6Uz",
        "_score" : 7.0790462,
        "_source" : {
          "shipId" : "01",
          "shipName" : "013913琼海口渔",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "013913<span style='color:red;'>琼海口渔</span>"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "bZMhcYQB4gQEvltnQKVb",
        "_score" : 7.0790462,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔013",
          "shipOwnerName" : "",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>013"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "a5MccYQB4gQEvltnY6Ur",
        "_score" : 7.0790462,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔013",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>013"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "bJMccYQB4gQEvltnZaV1",
        "_score" : 7.0790462,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔013",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>013"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "VZPbb4QB4gQEvltnraU6",
        "_score" : 6.506234,
        "_source" : {
          "shipId" : "01",
          "shipName" : "013913琼海口渔",
          "shipOwnerName" : "013913琼海口渔",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipOwnerName" : [
            "013913<span style='color:red;'>琼海口渔</span>"
          ],
          "shipName" : [
            "013913<span style='color:red;'>琼海口渔</span>"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "apMWcYQB4gQEvltnT6Vt",
        "_score" : 6.019184,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔013 李宁",
          "shipOwnerName" : "12341",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>013 李宁"
          ]
        }
      },
      {
        "_index" : "index_test_search_ship",
        "_type" : "_doc",
        "_id" : "cpNRcYQB4gQEvltnQ6Xw",
        "_score" : 6.019184,
        "_source" : {
          "shipId" : "01",
          "shipName" : "琼海口渔013 李宁",
          "shipOwnerName" : "李宁",
          "shipOwnerTel" : "15173934187",
          "shipOwnerIdNumber" : "430525199408136134",
          "fullText" : "01 解决12345 时代 15173934187 430525199408136134"
        },
        "highlight" : {
          "shipName" : [
            "<span style='color:red;'>琼海口渔</span>013 李宁"
          ]
        }
      }
    ]
  }
}

2.4 接收格式化后返回的接口数据

{
    "code": "SUCCESS",
    "businessCode": "0",
    "message": "操作成功",
    "data": {
        "total": 20,
        "searchShips": [
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "013234<span style='color:red;'>琼海口渔</span>",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "013913<span style='color:red;'>琼海口渔</span>",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>013",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>013",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>013",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "013913<span style='color:red;'>琼海口渔</span>",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "013913<span style='color:red;'>琼海口渔</span>",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>013 李宁",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "12341",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            },
            {
                "shipId": "01",
                "shipName": "<span style='color:red;'>琼海口渔</span>013 李宁",
                "shipRegistryPort": null,
                "shipOwnerId": null,
                "shipOwnerName": "李宁",
                "shipOwnerSex": null,
                "shipOwnerTel": "15173934187",
                "shipOwnerIdNumber": "430525199408136134",
                "deptId": null,
                "createTime": null,
                "bdsTerminalNo": null,
                "mmsi": null
            }
        ]
    }
}

可以看出,返回的字段,凡是命中关键词分词其中一个的都做高亮处理了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 带中文分词的全文检索(分页+高亮返回) 的相关文章

随机推荐

  • 由于找不到vcruntime140_1.dll,无法继续执行代码重新安装程序可能会解决此问题。

    出错情况如下 实在着不住了 那些不懂装懂的不要出来祸害人了 又是网上下载vcruntime140 dll放到c盘system32 64文件 这种做法纯属扯淡 vcruntime140 dll文件就是VC 2010的一个文件而已 直接下载运行
  • 序列化理解

    Java序列化 Java提供了一种对象序列化的机制 在该机制中 一个对象可以被表示为一个字节序列 该字节序列包含对象的数据 有关对象的类的信息和存储在对象中数据的类型 将序列化对象写入文件后 可以从文件中读取出来 对且对其进行反序列化 就是
  • 手把手教你配置Pytorch环境并使用(Win10系统下基于Anaconda完成的pytorch1.7.1和torchvision0.8.2的Pytorch深度学习环境搭建)

    概述 1 下载并安装Anaconda 2 在Anaconda Navigator中新建Pytorch虚拟环境 3 配置虚拟环境所需要的torch和torchvision 4 在Pycharm编译环境中使用刚刚建好的Pytorch虚拟环境 详
  • tensorflow兼容处理 tensorflow.compat.v1 tf.contrib

    20201130 问题提出 v1版本中tensorflow中contrib模块十分丰富 但是发展不可控 因此在v2版本中将这个模块集成到其他模块中去了 在学习tensorflow经常碰到tf contrib的代码 一敲就报错 import
  • ME28/ME2L/ME2N增强字段

    导语 用户希望在ME28采购订单审批的时候显示采购订单创建人以及描述 需要通过增强字段来实现 查询了一下SAP有标准的BADI可以进行增强 好像ME28 ME2L ME2N都是通过这里实现 使用不同的展示结构 这里没有深入测试其他事物 仅以
  • 终于弄明白 i = i++和 i = ++i 了

    作者 默辨 来源 https urlify cn Abyuyy 写在前面 前些天看完了JVM的内存结构 自以为自己是懂了 心里想想不就是分线程共享和线程私有嘛 然后又怎么怎么分怎么怎么的嘛 直到遇到了这道题目 说句实话 曾经自己做这种运算题
  • 空间金字塔池化、空洞卷积、深度可分离卷积

    空间金字塔池化 其主要目的是对于任意尺寸的输入产生固定大小的输出 思路 对于不同大小的feature map分成不同大小的块 不同大小的等份 根据具体情况进行设定 然后对每一份进行最大池化 一般是进行最大池化 将池化后的feature ma
  • 项目管理十大知识领域(十)--- 项目采购管理(过程、输入、工具和技术、输出)

    项目管理十大知识领域 十 项目采购管理 1 规划采购管理 输入 项目管理计划 需求文件 风险登记册 活动资源需求 项目进度计划 活动成本估算 干系人等级册 事业环境因素 组织过程资产 工具 自制或外购分析 专家判断 市场调研 会议 输出 采
  • leetcode第一题 :两数之和

    两数之和的哈希表解法 一 题目描述 二 算法思路 1 哈希表的相关说明 2 哈希算法 3 题目讲解 三 题解代码 四 运行结果以及最后的一点点解释 一 题目描述 这里直接贴的leetcode中的题目 哈哈哈 给定一个整数数组 和一个整数目标
  • 深入了解MySQL存储引擎-------InnoDB

    如果想看自己的数据库默认使用的那个存储引擎 可以通过使用命令SHOW VARIABLES LIKE storage engine 一 InnoDB存储引擎 1 InnoDB是事务型数据库的首选引擎 支持事务安全表 ACID 事务的ACID属
  • QT笔记- QListWidget删除item时, 信号QListWidget::currentRowChanged()出现行(索引)错误

    删除QListWidget行或项时 currentRowChanged 信号会在删除前发出 Qt信号QListWidget currentRowChanged int row 在QListWidget当前行号改变时发出 但需注意的是 在使用
  • Spring-IOC容器(控制反转)

    目录 Spring框架图 IOC原理 IOC接口 BeanFactory DI依赖注入 Spring框架图 1 核心层 Core Container 核心容器 这个模块是Spring最核心的模块 其他的都需要依赖该模块 2 AOP层 AOP
  • C++,友元的基本概念以及友元的创建

    一 友元 1 1 友元的基本概念 C 控制对类对象私有部分的访问 通常公有类方法提供唯一的访问途径 但是有时候这种限制太严格 以致于不适合特定的编程问题 在这种情况下 C 提供了另一种形式的访问权限 即友元 友元的种类 友元函数 友元类 友
  • 【软考】-高项-立项管理-重要知识点思维导图

    高项 立项管理 项目立项管理 项目立项包括4个阶段 项目建议与立项申请 含义 作用 项目建议书内容 初步可行性研究 详细可行性研究 内容 评估与决策 7个步骤 可行性研究 内容 可研报告中的开发总成本 经营成本 非经营成本 项目立项管理的作
  • Python判断一个数是否为素数

    Python判断一个数是否为素数 定义一个函数 用来判断一个数 是否为素数 函数名 isPrime 参数 数值n 返回值 布尔类型结果 def isPrime n flag True for i in range 2 n if n i 0
  • 服务器部署 Nginx + Django + Vue

    服务器部署 Nginx Django Vue 服务器预设 租服务器 SSH 远程连接 配置公钥 更新系统软件包 配置 Django 安装 python3 8 4 安装虚拟环境 创建虚拟环境 虚拟环境中安装 Django 和 uWSGI 安装
  • 搜索引擎中网络爬虫的设计分析

    搜索引擎中网络爬虫的设计分析 作者 Ackarlix 下面简单介绍一下搜索引擎的机器爬虫的制作和一些基本要注意的事项 说的简单易懂一些 网络爬虫跟你使用的 离线阅读 工具差不多 说离线 其实还是要跟网络联结 否则怎么抓东西下来 那么不同的地
  • C++学习必备网站推荐收藏

    在 C 的学习过程中离不开阅读大量的免费文档和网站 今天在此分享一些值得收藏的C 学习网站 希望对大家有所帮助 第一个 cplusplus http www cplusplus com 一个优秀的 C 学习网站 除了提供相应的教程之外 还有
  • [Python]pyinstaller打包32位exe小记

    由于媳妇工作中需要大量表格 故利用Python开发一个处理Excel表格的小工具 目前第一版本功能比较少 bug比较多 本人开发环境是在Mac系统下 然后在window下打包成64位和32位通用的exe程序 本文主要介绍打包过程中的流程和注
  • Elasticsearch 带中文分词的全文检索(分页+高亮返回)

    一 全文搜索介绍 Full text queries 全文搜索主要有以下几种类型 1 1 匹配查询 match query QueryBuilder qb matchQuery name field 字段 kimchy elasticsea