Elasticsearch使用备忘

有关TraCIAPI的备忘录 sumo给出了TraCI的接口函数,其中大概分类为如下图所示: 作为备忘录将具体函数接口列出,以备查用。 =========================================================================================================== AreaScope:http://7jpqqc.com1.z0. 阅读详情

最近我们需要对大约2T(6.5亿条)日志做全文检索,Elasticsearch看起来很火爆,又有很多产品使用(Facebook、github、stackoverflow),值得一试。以下是一些基础知识笔记。

Elasticsearch是一个基于Lucene构建的开源、分布式、RESTful的搜索引擎,能够实现近实时(NRT)搜索,稳定、可靠、安装方便。性能不错、水平扩展、文档齐全、社区火爆,这几点很重要。

如果之前已经了解过分布式存储系统、query切词、检索相关性策略,Elasticsearch的使用学习起来会很快。

1 基础概念

Elasticsearch是一个近实时的系统,从你写入数据到数据可以被检索到,一般会有1秒钟的延时。Elasticsearch是基于Lucene的,Lucene的读写是两个分开的句柄,往写句柄写入的数据刷新之后,读句柄重新打开,这才能读到新写入的数据。

名词解释:
Cluster:集群。
Index:索引,Index相当于关系型数据库的DataBase。
Type:类型,这是索引下的逻辑划分,一般把有共性的文档放到一个类型里面,相当于关系型数据库的table。
Document:文档,Json结构,这点跟MongoDB差不多。
Shard、Replica:分片,副本。

分片有两个好处,一个是可以水平扩展,另一个是可以并发提高性能。在网络环境下,可能会有各种导致分片无法正常工作的问题,所以需要有失败预案。ES支持把分片拷贝出一份或者多份,称为副本分片,简称副本。副本有两个好处,一个是实现高可用(HA,High Availability),另一个是利用副本提高并发检索性能。

分片和副本的数量可以在创建index的时候指定,index创建之后,只能修改副本数量,不能修改分片。

健康状态:
安装了head插件之后,可以在web上看到集群健康状态,集群处于绿色表示当前一切正常,集群处于黄色表示当前有些副本不正常,集群处于红色表示部分数据无法正常提供。绿色和黄色状态下,集群都是能提供完整数据的,红色状态下集群提供的数据是有缺失的。

2 搭建ElasticSearch

首先安装java,设置好JAVA_HOME环境变量(export JAVA_HOME=…/java8),然后安装Elasticsearch。

参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html

设置配置的时候,ES可能因为各种原因不能自动找到集群,所以把地址也设置上,如:

discovery.zen.ping.unicast.hosts: [“host_name…:9301”, “host_name_xxx:port_yyy”…]

安装head插件:拉取 https://github.com/mobz/elasticsearch-head 代码,将其放到./plugins/head 目录下。

启动之前设置ES使用的内存:export ES_HEAP_SIZE=10g。

elasticsearcy.yml配置文件中的一些配置点:

#设置集群名字
cluster.name: cswuyg_qa_pair_test
#设置node名字
node.name: xxx-node
#设置节点域名
network.host: 10.111.111.1
#设置内部传输端口和外部HTTP访问端口
transport.tcp.port: 9302
http.port: 8302
#设置集群其它节点地址
discovery.zen.ping.unicast.hosts: [“xxxhost:yyyport”]
#设置中文切词插件
index.analysis.analyzer.ik.type: “ik”
elasticsearch -d 以守护进程方式启动,启动之后,就可以在浏览器里使用head插件看到集群信息,如:

http://host_name_xxx:port_yyy/_plugin/head/
在这里插入图片描述
上图:启动了三个Elasticsearch实例,创建了三个Index;ceshi Index有一主shard,两replica shard;qa_pair1 Index只有主shard;website Index有一主shard,一replica shard。

3 测试Elasticsearch使用

Elasticsearch提供RESTful API,我采用Postman(chrome的一个插件)作为辅助客户端向ES发送请求。

可以向任意一个节点发起请求,虽然ES有Master的概念,但任意一个node都可以接受读写请求。

先创建一个index:

POST http://10.11.111.11:8301/test_index

查看创建的index:

GET http://10.11.111.11:8301/_cat/indices?v

写入数据:
在这里插入图片描述
在这里插入图片描述

查询数据:

(1)使用id直接查:
GET http://xxxhost:8201/qa_xx2/qa_xx3/1235
(2)DSL查询:

往查询url POST数据即可:
URL格式:http://xxxhost:8201/qa_xx2/qa_xx3/_search

a. 查询title中包含有cswuyg字段的文档。Highlight设置高亮命中的词。POST方法的body:

{
    "query": {
        "match": {
            "title": {
                "query": "cswuyg "
            }
        }
    },
    "highlight": {
        "fields": {
            "title": {
                
            }
        }
    }
}

b. bool组合查询,命中的文档的title字段必须能命中“餐厅”、“好吃”、“深圳”,可以是完全命中,也可以是名字其中的个别字。“便宜”则是可选命中。
POST方法的body:

{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "title": {
                        "query": "餐厅"
                    }
                }
            },
            {
                "match": {
                    "title": {
                        "query": "好吃"
                    }
                }
            },
            {
                "match": {
                    "title": {
                        "query": "深圳"
                    }
                }
            }],
            "should": [{
                "match": {
                    "title": "便宜"
                }
            }]
        }
    },
    "highlight": {
        "fields": {
            "title": {
                
            }
        }
    }
}

如果要求每一个字都命中,可以把match修改为match_phrase。

{
    'query': {
        'bool': {
            'should': [{
                'match': {
                    'title': {
                        'query': '张三',
                        'boost': 0.2
                    }
                }
            }],
            'must': [{
                'match_phrase': {
                    'title': {
                        'query': '李四',
                        'boost': 0.69
                    }
                }
            },
            {
                'match_phrase': {
                    'title': {
                        'query': '王五',
                        'boost': 0.11
                    }
                }
            }]
        }
    }
}

例子:要求必须完全命中“酒后”和“标准",“驾驶”可以部分命中

{
    "query": {
        "bool": {
            "must": [{
                "match_phrase": {
                    "question": {
                        "query": "酒后",
                        "boost": 0.69
                    }
                }
            },
            {
                "match": {
                    "question": {
                        "query": "驾驶",
                        "boost": 0.11
                    }
                }
            },
            {
                "match_phrase": {
                    "question": {
                        "query": "标准",
                        "boost": 0.2
                    }
                }
            }]
        }
    }
}

c. 给查询词设置权重(boost)。POST方法的body:

{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "title": {
                        "query": "好吃的餐厅",
                        "boost": 1
                    }
                }
            },
            "must": {
                "match": {
                    "title": {
                        "query": "深圳湾",
                        "boost": 100
                    }
                }
            },
            "should": [{
                "match": {
                    "title": "便宜"
                }
            }]
        }
    },
    "highlight": {
        "fields": {
            "title": {
                
            }
        }
    }
}

d. filter查询,也就是kv查询,不涉及检索的相关性打分,title必须是完全命中,如果建库时是有对这个字段切词的,则查询时,需要是切词后的某个词去查询,如“今天天气”,建库切词为“今天”和“天气”,那么filter查询的时候需要使用“今天”或者“天气”才能命中。POST方法的body:

{
    "query": {
        "bool": {
            "filter": [{
                "term": {
                    "title": "好吃的"
                }
            }]
        }
    }
}

e. 完全匹配某个短语,这就要求“好厉害”三个字组成的词必须在文档中出现,不能是只出现其中的个别字(match就是这样)。POST方法的body:

{
    "query": {
        "match_phrase": {
            "title": {
                "query": "好厉害"
            }
        }
    }
}

(3)运维

a. 去掉副本,调研的时候希望不要副本,这样子写入会快点

PUT http://10.11.111.11:8202/qa_pair2/_settings
{
   "number_of_replicas" : 0
}

4 使用ik中文切词插件

Elasticsearch默认的中文切词插件是单字切词,这不能满足我们要求,需要安装中文切词插件。

插件github地址:https://github.com/medcl/elasticsearch-analysis-ik
源码安装:编译时需要联网,可以在windows下编译完之后,把elasticsearch-analysis-ik-1.9.3.zip拷贝到linux机器的./plugin/head目录下解压。
配置:在配置文件./config/elasticsearch.yml末尾添加配置: index.analysis.analyzer.ik.type: “ik”

测试ik切词:http://host_name_xx:port_yyy/qa_pair/_analyze?analyzer=ik&pretty=true&text=我是中国人"

5 使用python读写Elasticsearch

驱动安装:使用pip安装elasticsearch

读取文件批量插入数据示例:

#!/home/work/bin/python
#-*-coding:utf8-*-
"""
读取文件,入库到es
使用:python insert_demo.py xxx_file_name

Authors: cswuyg 
Date: 2016.06.18
"""

from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from elasticsearch import exceptions
import traceback
import datetime
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

#设置mappings
def _create_index(es, index_name="cswuyg", doc_type_name="cswuyg"):
    my_settingss = {
            'number_of_shards': 18,
            'number_of_replicas': 0
            }
    my_mappings = {
            "cswuyg": {
                '_all': {
                    'enabled': 'false'
                    },
                "properties": {
                    "title": {
                        'type': 'string',
                        'store': 'no',
                        'term_vector': 'with_positions_offsets',
                        'analyzer': 'ik_max_word',
                        'boost': 8
                        },
                    "url": {
                        "type": "string",
                        'index': 'not_analyzed'
                        },
                    'content': {
                        'type': 'string',
                        'store': 'no',
                        'term_vector': 'with_positions_offsets',
                        'analyzer': 'ik_max_word',
                        'boost': 8
                        }
                    }
                }
            }
    settings = {
            'settings': my_settingss, 
            'mappings': my_mappings
            }

    create_index = es.indices.create(index=index_name, body=settings)

#将文件中的数据存储到es中
def _save_data(es, input_file):
    #读入数据
    all_data = list()
    count = 0
    with open(input_file) as f_r:
        for line in f_r:
        count += 1
            all_data.append({
                '_index': 'cswuyg',
                '_type': 'cswuyg',
                '_source': {
                    'title': line
                    }
                })
            if len(all_data) == 100:
                success, _ = bulk(es, all_data, index='cswuyg', raise_on_error=True)
                all_data = list()
                print('{1}: finish {0}'.format(count, input_file))
    if len(all_data) != 0:
        success, _ = bulk(es, all_data, index='cswuyg', raise_on_error=True)
        all_data = list()
        print('{1}: finish {0}'.format(count, input_file))
    print('{0}: finish all'.format(input_file))

def _insert_data(es, file_name):
    start_time = datetime.datetime.now()
    _save_data(es, file_name)
    cost_time = datetime.datetime.now() - start_time
    print('all cost time{0}'.format(cost_time))

def _main():
    if len(sys.argv) != 2:
        print('need file argument')
        return 
    es = Elasticsearch(hosts=["10.200.100.80:8301"], timeout=500)
    try:
        _create_index(es)
    except exceptions.RequestError:
        print(traceback.format_exc())
    _insert_data(es, sys.argv[1]);

if __name__ == '__main__':
    _main()

测试文件数据格式:

我是中国人
我爱中国

检索示例(从文件中获取检索条件:切好词且打好分的Term):

#!/home/work/bin/python
#-*-coding:utf8-*-
"""
检索 es
策略:
从文件中读取已经切好词,且给好权重的term,且选好必选term的一行文本,处理成match_phrase + bool查询
默认策略2

使用方法:python search_demo.py test_file
output:
es_query
query\ttitle\tsall_score

output demo:
{'query': {'bool': {'should': [{'match': {'title': {'query': '\xe6\x88\x91', 'boost': 0.2}}}], 'must': [{'match_phrase': {'title': {'query': '\xe4\xb8\xad\xe5\x9b\xbd', 'boost': 0.69}}}, {'match_phrase': {'title': {'query': '\xe7\x88\xb1', 'boost': 0.11}}}]}}}
我爱中国        我爱中国        {"should": ["我"], "score": {"我": 0.2, "中国": 0.69, "爱": 0.11}, "must": ["中国", "爱"]}
我爱中国        我爱中国        {"should": ["我"], "score": {"我": 0.2, "中国": 0.69, "爱": 0.11}, "must": ["中国", "爱"]}
Authors: cswuyg
Date: 2016.06.18
"""
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from elasticsearch import exceptions
import sys
import json
from log import logger
import traceback

reload(sys)
sys.setdefaultencoding('utf-8')

def _release_es_query_by_file_info(file_info):
    #输入格式: raw_query\tmust_term\tshould_term\tall_score
    logger.debug('file_info:{0}'.format(file_info))
    file_info_list = file_info.split('\t')
    print file_info_list
    raw_query = file_info_list[0]
    must_term = file_info_list[3]
    should_term= file_info_list[4]
    all_score = file_info_list[5]
    json_score = json.loads(all_score, encoding='utf-8')
    
    ret_obj = {}
    ret_obj['must'] = must_term.split()
    ret_obj['should'] = should_term.split()
    ret_obj['score'] = json_score 

    bool_query = dict()
    must_query = list()
    should_query = list()
    for item in must_term.split(' '):
        must_query.append({'match_phrase': {'title': {'query': item, 'boost': json_score[unicode(item)]}}})
    bool_query['must'] = must_query

    for item in should_term.split(' '):
        should_query.append({'match': {'title': {'query': item, 'boost': json_score[unicode(item)]}}})
    bool_query['should'] = should_query

    es_query = {'query': {'bool': bool_query}}
    print es_query
    return raw_query, es_query, json.dumps(ret_obj, ensure_ascii=False) 

def _do_query_use_file_info(es, file_info):
    raw_query, query, all_score = _release_es_query_by_file_info(file_info.strip('\r\n'))
    res = es.search(index='cswuyg', doc_type='cswuyg', body=query, size=100)
    if (len(res['hits']['hits']) == 0):
        logger.debug('len(res["hits"]["hits"]) == 0')
        print("{0}\t{1}\t{2}".format(raw_query, "", all_score))
        return 

    for item in res['hits']['hits']:
        try:
            print("{0}\t{1}\t{2}".format(raw_query, item['_source']['title'].strip('\r\n'), all_score))
        except:
            logger.debug(traceback.format_exc())
            logger.debug(item['_source']['title'])
    print('\r\n')

def _main():
    if len(sys.argv) != 2:
        print('argv error')
        return
    else:
        print('argv[1] = {0}'.format(sys.argv[1]))
    es = Elasticsearch(hosts=["10.200.100.80:8301"], timeout=5000)
    with open(sys.argv[1]) as f_r:
        for item in f_r:
            try:
                _do_query_use_file_info(es, item)
            except:
                logger.debug(traceback.format_exc())
    
if __name__ == '__main__':
    _main()

测试文件数据格式:

我爱中国 中国 爱 我 {“我”: 0.20, “中国”: 0.69, “爱”: 0.11}

6 部分学习资料

官方入门文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
使用ik中文分词插件:http://blog.youkuaiyun.com/liuzhenfeng/article/details/39404435
提升性能:http://zhousheng29.iteye.com/blog/2101905
Elasticsearch有哪些用户:https://www.elastic.co/use-cases

附上我们的ES使用效果:

使用了ES 2.3版本,集群使用了4台机器18块磁盘,启了18个节点,每个节点15G内存,共270G内存。Index无副本,disable掉了_all索引,2T数据入库完占了大约4T磁盘空间,10进程并发写入,速度可以达到1W条/s(写入多了后面会变慢),部分磁盘写入延迟达到几百毫秒,瓶颈在磁盘IO上。首次召回100W+的文档耗时2s+,但如果是触发了缓存的召回,可以达到50ms级别的耗时。多加机器,增加shard可以提高读写性能。

转载地址:https://www.cnblogs.com/cswuyg/p/5651620.html

Cytoscape 3.7.2 windows系统 Cytoscap是免费的用于绘制网络的软件,官网为https://cytoscape.org/,但是国内用户下载速度堪忧,并且很可能容易中断,这里分享到优快云供大家下载。 Cytoscape is an open source software platform for visualizing molecular interaction networks and biological pathways and integrating these networks with annotations, gene expression profiles and other state data. 立即下载

相关推荐

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果

官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。

qianxin1234的博客 2019

超详细Windows 10 Cytoscape安装教程

超详细Windows 10 Cytoscape安装教程

qq_45344586的博客 3万+

告别混乱代码!在Arduino IDE中管理多文件项目的5个必备技巧

本文分享了在Arduino IDE中管理多文件项目的5个必备技巧,帮助开发者告别混乱代码。通过代码分割和模块化设计,提升编译效率、降低内存占用,并实现功能解耦。重点介绍了头文件设计、CPP文件实现、调试技巧和工业级目录结构,让你的Arduino项目像乐高积木一样清晰易维护。

fun88的博客 361

Cytoscape安装后无法打开

Cytoscape是一款图形化显示网络并进行分析和编辑的软件,从官网下载了最新的版本 3.7.2,安装好软件后无论怎么点击都没有反应,没有任何窗口弹出或提示出现。

yyywxk的博客 4万+

Android应用开发从零到一:基于Kotlin与Jetpack Compose的完整实践指南

移动应用开发的核心在于构建一个架构清晰、可维护且可扩展的应用基础。理解应用架构的原理,如关注点分离和数据驱动UI,是实现高质量应用的关键技术价值。在现代Android开发中,Kotlin语言凭借其空安全特性和协程,能有效提升代码的健壮性与开发效率。Jetpack Compose作为声明式UI框架,代表了UI开发的未来方向,与Kotlin协程深度集成,简化了复杂交互界面的构建。这些技术共同服务于个人任务管理、企业工具等多种应用场景。本文以构建一个完整的个人任务管理应用为例,系统阐述从环境搭建、UI构建、数据持

weixin_32667955的博客 313

新英格兰10机39节点matlab建模,ieee10机39节点系统数据

【实例简介】ieee10机39节点系统数据,主要是BPA数据!【实例截图】【核心代码】ne_039_bus└── ne_039_bus├── 039readme.doc├── bpa│ ├── 039bpa.dat│ ├── 039bpa.swi│ ├── LFerr.LIS│ ├── OneNote 目录.onetoc2│ └── STERR.LIS├── eurostag│...

weixin_39851809的博客 3274

Cytoscape 安装教程 | Network Data Integration, Analysis, and Visualization in a Box

Cytoscape 安装教程 Network Data Integration, Analysis, and Visualization in a Box

叶庭云 成为自己的光 2597

【嘉立创EDA】PCB金属包边设计快捷方法

本文使用嘉立创EDA,描述如何在PCB设计时,快速增加边框包边设计,特别是金属包边(伪)——这里标记(伪)是因为该这里的包边特指不含边缘壁。请参考本文时特别注意!本文将此过程记录,以供有需要的读者参考。

l64481000的博客 1744

elasticsearch使用优化备忘

做过哪些优化 官方优化建议 1.jvm使用合适的jvm 2.增大可以打开的文件数 3.增大可以开启的线程数 4.增大mmap使用的限制vma 5.减少swap,可以开启memory lock,或者禁用swap 6.master expecial 业务中 使用alias来进行全量index的无缝替换 new index的时候只有一个replica,完成后在加一个replica set slow_log add coordinator node 并使用g1 update refresh_interval no

寒夜 294

AI智能体面试实战与真题解析: 312+道面试题完整答案 (下篇)

本文覆盖220道基础八股文+92道项目面试题,涵盖Agent架构、RAG、工具调用、记忆系统、多智能体、大模型基础、工程化实践、Prompt工程9大模块,含完整代码实现和模拟面试剧本。

program哲学 303

42、使用mmrotate中k3det进行旋转目标检测,并进行mnn部署和ncnn部署

基本思想:仍然是身份证分割,并进行ncnn和mnn的c++的部署开发

sxj731533730 5711

Elasticsearch snapshot 备份的使用方法 【备忘】

常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失。虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制。 数据灾备。在整个集群无法正常工作时,可以及时从备份中恢复数据。 归档数据。随着数据的积累,比如日志类的数据,集群的存储压力会越来越大,不管是内存还是磁盘都要承担数据增多带来的压力,此时我们往...

weixin_30825199的博客 387

两组相机(或三维点)对齐方法介绍及实现代码(求解相似变换,包含旋转R、平移t、尺度s)

  这个变换用于将生成的稀疏重建场景对齐到真值上。由于SfM(Structure from Motion,运动恢复结构)求解的结果是尺度未定的,所以重建场景与真值之间不仅会相差一个旋转与平移,还会存在尺度缩放。待求解的问题可以描述为:已知一组相机(个数为m)的位姿真值Rgt、tgt和预测位姿Rpred、tpred,现要将预测值对齐到真值上。它们之间会相差一个相似变换Msimilarity,包括尺度s、旋转量R、平移量t,可以根据如下步骤进行求解:    1 求解旋转R   首先计算所有m个相机的位姿差异总和

zeeq的博客 3926

ElasticSearch Java High Level Client使用备忘

ElasticSearch Java High Level Client 封装类似SQL select * from xxx group by xxx.xxx order by xxx的实现 可以通过top_hits实现 /** * @return SearchSourceBuilder 是封装在SearchRequest里的,它里面就是ElasticSearch的查询条件 */ publi...

Layingo的博客 396

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

elasticsearch API使用方法备忘(Python)

安装模块pip install elasticsearch创建连接fromelasticsearchimportElasticsearches=Elasticsearch(['192.168.1.1:9200'])多节点es=Elasticsearch(['192.168.1.1:9200',’192.168.1.2:9200’])支持SSL的连接es = E...

weixin_33790053的博客 177

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

es6 语法学习 - 备忘录模式

备忘录设计模式(Memento Design Pattern)是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个示例展示了如何使用备忘录模式来捕获和保存对象的状态,并在需要时恢复该状态。通过这种方式,可以在不破坏对象封装性的前提下,实现对象的状态管理。

simahe的专栏 349

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

html页面ne module,ES6中module的几种使用方法(备忘单)

这是一份备忘单,展示了不同的导出方式和相应的导入方式。 它实际上可分为3种类型:名称,默认值和列表 。// 命名导入/导出export const name = 'value'import { name } from '...'// 默认导出/导入export default 'value'import anyName from '...'// 重命名导入/导出export { name as n...

weixin_36269396的博客 617

Elasticsearch 常见问题汇总及解决姿势(后续会持续更新)

Elasticsearch 常见问题汇总及解决姿势(后续会持续更新)

asdfgh0077的博客 136

如何使用Voice Memos:从零开始的语音备忘录录制指南 [特殊字符]

想要快速记录灵感、会议要点或重要想法吗?Voice Memos是一个功能强大的渐进式Web应用,让你能够轻松录制、管理和播放语音备忘录。无论你是需要记录日常灵感的学生,还是需要捕捉会议要点的职场人士,这个语音备忘录工具都能满足你的需求。本文将为你提供完整的Voice Memos使用指南,帮助你快速掌握这个实用的语音录制应用。 ## 什么是Voice Memos语音备忘录应用? 📱 Voice

gitblog_00939的博客 1129

这些华为使用小技巧你知道吗

这些华为技巧也太实用了吧!技巧一:熄屏快速通话事实上,华为手机的长按功能不仅限于桌面长按,其音量键也“隐藏”了一些实用功能。例如:当我们需要打电话的时候,不需要解锁屏幕就能直接进入通讯录,并且找到联系人再拨号。想知道具体是怎么操作的吗?接着往下看看吧~具体操作步骤如下:步骤:打开【熄屏快呼】的功能,之后只要按住音量下键,说出联系人姓名即可自动拨打电话。技巧二:智慧搜索——可选的搜索引擎我们可以利用智慧搜索,自由选择一个网页搜索引擎,只要根据自己的需要设置搜索引擎,让显示的网页内容符合我们的搜索习惯就可以了,

huduokyou的博客 753

基于react-app搭建react-router+redux项目

前言 总括:本文采用react+redux+react-router+less+es6+webpack,以实现一个简易备忘录(todolist)为例尽可能全面的讲述使用react全家桶实现一个完整应用的过程。 代码地址:React全家桶实现一个简易备忘录 原文博客地址:React全家桶实现一个简易备忘录 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击...

zxh2075的专栏 396
上一篇: 一个很详细的web.xml讲解
下一篇: 全文搜索引擎 Elasticsearch 入门教程
With__Sunshine
博客等级 码龄9年 128粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值