热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【ES】Elasticsearch分词器使用和简单查询

文章目录Elasticsearch一.analysis与analyzer1.1内置的分词器1.2内置分词器示例1.3中文分词1.3.1IK分词器1.3.2HanLP1.3.3pin

文章目录
Elasticsearch
一. analysis与analyzer
1.1 内置的分词器
1.2 内置分词器示例
1.3 中文分词
1.3.1 IK分词器
1.3.2 HanLP
1.3.3 pinyin分词器
1.4 中文分词演示
1.5 分词的实际应用
1.5.1 设置mapping
1.5.2 插入数据
1.5.3 查询
1.6 拼音分词器
1.6.1 设置settings
1.6.2 设置mapping
1.6.3 数据的插入
1.6.4 查询
1.7 中文、拼音混合查找
1.7.1 设置settings
1.7.2 mappings设置
1.7.3 添加数据
1.7.4 查询
二. spring boot与Elasticsearch的整合
2.1 添加依赖
2.2 获取ElasticsearchTemplate
2.3 POJO类的定义
2.4 查询
Elasticsearch
一. analysis与analyzer
​ analysis(只是一个概念),文本分析是将全文本转换为一系列单词的过程,也叫分词。analysis是通过analyzer(分词器)来实现的,可以使用Elasticsearch内置的分词器,也可以自己去定制一些分词器。除了在数据写入的时候将词条进行转换,那么在查询的时候也需要使用相同的分析器对语句进行分析。

​ anaylzer是由三部分组成,例如有

Hello a World, the world is beautifu

:
1. Character Filter: 将文本中html标签剔除掉。
2. Tokenizer: 按照规则进行分词,在英文中按照空格分词。
3. Token Filter: 去掉stop world(停顿词,a, an, the, is),然后转换小写。
1
2
3


1.1 内置的分词器
分词器名称    处理过程
Standard Analyzer    默认的分词器,按词切分,小写处理
Simple Analyzer    按照非字母切分(符号被过滤),小写处理
Stop Analyzer    小写处理,停用词过滤(the, a, this)
Whitespace Analyzer    按照空格切分,不转小写
Keyword Analyzer    不分词,直接将输入当做输出
Pattern Analyzer    正则表达式,默认是\W+(非字符串分隔)
1.2 内置分词器示例
A. Standard Analyzer

GET _analyze
{
  "analyzer": "standard",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
B. Simple Analyzer

GET _analyze
{
  "analyzer": "simple",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
C. Stop Analyzer

GET _analyze
{
  "analyzer": "stop",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
D. Whitespace Analyzer

GET _analyze
{
  "analyzer": "whitespace",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
E. Keyword Analyzer

GET _analyze
{
  "analyzer": "keyword",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
F. Pattern Analyzer

GET _analyze
{
  "analyzer": "pattern",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
1
2
3
4
5
1.3 中文分词
​ 中文分词在所有的搜索引擎中都是一个很大的难点,中文的句子应该是切分成一个个的词,一句中文,在不同的上下文中,其实是有不同的理解,例如下面这句话:

这个苹果,不大好吃/这个苹果,不大,好吃
1
1.3.1 IK分词器
IK分词器支持自定义词库,支持热更新分词字典,地址为 https://github.com/medcl/elasticsearch-analysis-ik

elasticsearch-plugin.bat install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
1
安装步骤:

下载zip包,下载路径为:https://github.com/medcl/elasticsearch-analysis-ik/releases
在Elasticsearch的plugins目录下创建名为 analysis-ik 的目录,将下载好的zip包解压在该目录下
在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat


IK分词插件对应的分词器有以下几种:

ik_smart
ik_max_word
GET _analyze
{
  "analyzer": "ik_smart",
  "text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
1
2
3
4
5
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
1
2
3
4
5
1.3.2 HanLP
安装步骤如下:

下载ZIP包,下载路径为:https://pan.baidu.com/s/1mFPNJXgiTPzZeqEjH_zifw#list/path=%2F,密码i0o7
在Elasticsearch的plugins目录下创建名为 analysis-hanlp 的目录,将下载好的elasticsearch-analysis-hanlp-7.4.2.zip包解压在该目录下.
下载词库,地址为:https://github.com/hankcs/HanLP/releases
将analyzer-hanlp目录下的data目录删掉,然后将词库 data-for-1.7.5.zip 解压到anayler-hanlp目录下
将 第2步 解压目录下的 config 文件夹中两个文件 hanlp.properties hanlp-remote.xml 拷贝到ES的根目录中的config目录下 的analysis-hanlp 文件夹中(analyzer-hanlp 目录需要手动去创建)。
将hanlp分词器安装的时候所需的文件\hanlp文件夹中提供的六个文件拷贝到 $ES_HOME\plugins\analysis-hanlp\data\dictionary\custom 目录下。
在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat


HanLP对应的分词器如下:

hanlp,默认的分词
hanlp_standard,标准分词
hanlp_index,索引分词
hanlp_nlp,nlp分词
hanlp_n_short,N-最短路分词
hanlp_dijkstra,最短路分词
hanlp_speed,极速词典分词
GET _analyze
{
  "analyzer": "hanlp",
  "text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
1
2
3
4
5
1.3.3 pinyin分词器
安装步骤:

下载ZIP包,下载路径为:https://github.com/medcl/elasticsearch-analysis-pinyin/releases
在Elasticsearch的plugins目录下创建名为 analyzer-pinyin 的目录,将下载好的elasticsearch-analysis-pinyin-7.4.2.zip包解压在该目录下.
在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat


1.4 中文分词演示
ik_smart

GET _analyze
{
  "analyzer": "ik_smart",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
1
2
3
4
5
hanlp

GET _analyze
{
  "analyzer": "hanlp",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
1
2
3
4
5
hanlp_standard

GET _analyze
{
  "analyzer": "hanlp_standard",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
1
2
3
4
5
hanlp_speed

GET _analyze
{
  "analyzer": "hanlp_speed",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
1
2
3
4
5
1.5 分词的实际应用
​ 在如上列举了很多的分词器,那么在实际中该如何应用?

1.5.1 设置mapping
​ 要想使用分词器,先要指定我们想要对那个字段使用何种分词,如下所示:

# 先删除当前索引
DELETE user

# 自定义某个字段的分词器
PUT user
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "hanlp_index"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.5.2 插入数据
POST user/_bulk
{"index":{}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{}}
{"content":"剑桥的网盘不好用"}
1
2
3
4
5
6
7
1.5.3 查询
GET user/_search
{
  "query": {
    "match": {
      "content": "密码"
    }
  }
}
1
2
3
4
5
6
7
8
1.6 拼音分词器
​ 在查询的过程中我们可能需要使用拼音来进行查询,在中文分词器中我们介绍过 pinyin 分词器,那么在实际的工作中该如何使用呢?

1.6.1 设置settings
PUT /medcl 
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "pinyin_analyzer" : {
                    "tokenizer" : "my_pinyin"
                 }
            },
            "tokenizer" : {
                "my_pinyin" : {
                    "type" : "pinyin",
                    "keep_separate_first_letter" : false,
                    "keep_full_pinyin" : true,
                    "keep_original" : true,
                    "limit_first_letter_length" : 16,
                    "lowercase" : true,
                    "remove_duplicated_term" : true
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
如上所示,我们基于现有的拼音分词器定制了一个名为 pinyin_analyzer 这样一个分词器。可用的参数可以参照:https://github.com/medcl/elasticsearch-analysis-pinyin

1.6.2 设置mapping
PUT medcl/_mapping
{
        "properties": {
            "name": {
                "type": "keyword",
                "fields": {
                    "pinyin": {
                        "type": "text",
                        "analyzer": "pinyin_analyzer",
                        "boost": 10
                    }
                }
            }
        }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.6.3 数据的插入
POST medcl/_bulk
{"index":{}}
{"name": "马云"}
{"index":{}}
{"name": "马化腾"}
{"index":{}}
{"name": "李彦宏"}
{"index":{}}
{"name": "张朝阳"}
{"index":{}}
{"name": "刘强东"}
1
2
3
4
5
6
7
8
9
10
11
1.6.4 查询
GET medcl/_search
{
  "query": {
    "match": {
      "name.pinyin": "zcy"
    }
  }
}
1
2
3
4
5
6
7
8
1.7 中文、拼音混合查找
1.7.1 设置settings
PUT product
{
  "settings": {
    "analysis": {
      "analyzer": {
        "hanlp_standard_pinyin":{
          "type": "custom",
          "tokenizer": "hanlp_standard",
          "filter": ["my_pinyin"]
        }
      },
      "filter": {
        "my_pinyin": {
          "type" : "pinyin",
          "keep_separate_first_letter" : false,
          "keep_full_pinyin" : true,
          "keep_original" : true,
          "limit_first_letter_length" : 16,
          "lowercase" : true,
          "remove_duplicated_term" : true
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.7.2 mappings设置
PUT product/_mapping
{"properties": {
    "content": {
      "type": "text",
      "analyzer": "hanlp_standard_pinyin"
    }
  }
}
1
2
3
4
5
6
7
8
1.7.3 添加数据
POST product/_bulk
{"index":{}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{}}
{"content":"剑桥的网盘不好用"}
1
2
3
4
5
6
7
1.7.4 查询
GET product/_search
{
  "query": {
    "match": {
      "content": "wangpan"
    }
  },
  "highlight": {
    "pre_tags": "",
    "post_tags": "
",
    "fields": {
      "content": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
属性名    解释
keep_first_letter    true: 将所有汉字的拼音首字母拼接到一起:李小璐 -> lxl
keep_full_pinyin    true:在最终的分词结果中,会出现每个汉字的全拼:李小璐 -> li , xiao, lu
keep_none_chinese    true: 是否保留非中文本,例如 java程序员, 在最终的分词结果单独出现 java
keep_separate_first_lett    true: 在最终的分词结果单独将每个汉字的首字母作为一个结果:李小璐 -> l, y
keep_joined_full_pinyin    true:在最终的分词结果中将所有汉字的拼音放到一起:李小璐 -> liuyan
keep_none_chinese_in_joined_full_pinyin    true:将非中文内容文字和中文汉字拼音拼到一起
none_chinese_pinyin_tokenize    true: 会将非中文按照可能的拼音进行拆分:wvwoxvlu -> w, v, wo, x, v, lu
keep_original    true: 保留原始的输入
remove_duplicated_term    true: 移除重复
二. spring boot与Elasticsearch的整合
2.1 添加依赖

    org.springframework.boot
    spring-boot-starter-data-elasticsearch

1
2
3
4
2.2 获取ElasticsearchTemplate
package com.qf.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;

import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
public class ElasticSearchConfig extends ElasticsearchConfigurationSupport {

    @Bean
    public Client elasticsearchClient() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

        return client;
    }


    @Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(elasticsearchClient(), entityMapper());
    }

    // use the ElasticsearchEntityMapper
    @Bean
    @Override
    public EntityMapper entityMapper() {
        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
                new DefaultConversionService());
        entityMapper.setConversions(elasticsearchCustomConversions());
        return entityMapper;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2.3 POJO类的定义
@Document(indexName = "movies", type = "_doc")
public class Movie {
    private String id;
    private String title;
    private Integer year;
    private List genre;
    // setters and getters
}
1
2
3
4
5
6
7
8
2.4 查询
A. 分页查询

// 分页查询
@RequestMapping("/page")
public Object pageQuery(
    @RequestParam(required = false, defaultValue = "10") Integer size,
    @RequestParam(required = false, defaultValue = "1") Integer page) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withPageable(PageRequest.of(page, size))
        .build();

    List movies = elasticsearchTemplate
        .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
B. range查询

// 单条件范围查询, 查询电影的上映日期在2016年到2018年间的所有电影
@RequestMapping("/range")
public Object rangeQuery() {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(new RangeQueryBuilder("year").from(2016).to(2018))
                .build();

    List movies = elasticsearchTemplate
                .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
C. match查询

// 单条件查询只要包含其中一个字段
@RequestMapping("/match")
public Object singleCriteriaQuery(String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(new MatchQueryBuilder("title", searchText))
            .build();

    List movies = elasticsearchTemplate
            .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
D. 多条件分页查询

@RequestMapping("/match/multiple")
public Object multiplePageQuery(
    @RequestParam(required = true) String searchText,
    @RequestParam(required = false, defaultValue = "10") Integer size,
    @RequestParam(required = false, defaultValue = "1") Integer page) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(
        new BoolQueryBuilder()
        .must(new MatchQueryBuilder("title", searchText))
        .must(new RangeQueryBuilder("year").from(2016).to(2018))
    ).withPageable(PageRequest.of(page, size))
        .build();

    List movies = elasticsearchTemplate
        .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
E. 多条件或者查询

@RequestMapping("/match/or/multiple")
public Object multipleOrQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(
        new BoolQueryBuilder()
        .should(new MatchQueryBuilder("title", searchText))
        .should(new RangeQueryBuilder("year").from(2016).to(2018))
    ).build();

    List movies = elasticsearchTemplate
        .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
F. 精准匹配一个单词,且查询就一个单词

//其中包含有某个给定单词,必须是一个词
@RequestMapping("/term")
public Object termQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new TermQueryBuilder("title", searchText)).build();

    List movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
精准匹配多个单词

//其中包含有某个几个单词
@RequestMapping("/terms")
public Object termsQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new TermsQueryBuilder("title", searchText.split("\\s+"))).build();

    List movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
G. 短语匹配

@RequestMapping("/phrase")
public Object phraseQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(new MatchPhraseQueryBuilder("title", searchText))
            .build();

    List movies = elasticsearchTemplate
            .queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
H. 只查询部分列

@RequestMapping("/source")
public Object sourceQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withSourceFilter(new FetchSourceFilter(
               new String[]{"title", "year", "id"}, new String[]{}))
        .withQuery(new MatchPhraseQueryBuilder("title", searchText))
        .build();

    List movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
12
I. 多字段匹配

@RequestMapping("/multiple/field")
public Object allTermsQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new MultiMatchQueryBuilder(searchText, "title", "genre")
                   .type(MultiMatchQueryBuilder.Type.MOST_FIELDS))
        .build();

    List movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
1
2
3
4
5
6
7
8
9
10
11
J. 多单词同时包含

// 多单词同时包含
@RequestMapping("/also/include")
public Object alsoInclude(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new QueryStringQueryBuilder(searchText)
                   .field("title").defaultOperator(Operator.AND))
        .build();

    List movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
————————————————


推荐阅读
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • 本文详细探讨了在ASP.NET环境中通过加密数据库连接字符串来提升数据安全性的方法。加密技术不仅能够有效防止敏感信息泄露,还能增强应用程序的整体安全性。文中介绍了多种加密手段及其实施步骤,帮助开发者在日常开发过程中更好地保护数据库连接信息,确保数据传输的安全可靠。 ... [详细]
author-avatar
MC_炽焰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有