`
manjingtou
  • 浏览: 122416 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PostgreSQL 8.3.1 全文检索(Full Text Search)

阅读更多

 PostgreSQL 8.3.1  全文检索

在postgreSQL 8.3自带支持全文检索功能,在之前的版本中需要安装配置tsearch2才能使用,安转配置tsearch2就不再多说了,主要介绍一下8.3中自带全文检索功能。

全文检索类型(Text Search Types)

postgreSQL设计支持全文检索,提供两个数据类型(tsvector,tsquery),并且通过动态检索自然语言文档的集合,定位到最匹配的查询结果。

tsvector

一个tsvector的值是唯一分词的分类列表,把一话一句词格式化为不同的词条,在进行分词处理的时候
tsvector会自动去掉分词中重复的词条,按照一定的顺序装入。例如

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
                      tsvector
----------------------------------------------------
 'a' 'on' 'and' 'ate' 'cat' 'fat' 'mat' 'rat' 'sat'

从上面的例子可以看出 ,通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照长短和字母来排序的。但是某些时候,我们为了让词条中包含空格或者符号,就需要对其使用引号。
SELECT $$the lexeme '    ' contains spaces$$::tsvector;
                 tsvector                 
-------------------------------------------
 'the' '    ' 'lexeme' 'spaces' 'contains'

为了使用引号,我们可以使用双$$符号来避免混淆。
并且词条位置常量可以附属于每个词条,例如:
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
                                  tsvector
-------------------------------------------------------------------------------
 'a':1,6,10 'on':5 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4

这个位置信息通常就是当前文档中单词所处的位置,这个位置信息用于关注度的体现。位置信息常量的值的范围为1 到 16383。分词后,会把相同词条的位置记录到一个词条中。(如上所示)。
词条通过权重可以使其所在位置促进它的标记。权重分为A,B,C,D,D为默认值可以不显示.

权重用于关系,体现文档结构是很有特色地.例如,通俗一点,就是相同的词条,但是词条所在位置的权重不一样,在一个文档中,标题和文本内容,在做全文检索排序功能时需要分配给这两个词不同的优先权,不同的权重标记.

理解tsvector类型是很重要的,不能只关注标准的应用.例如
select 'The Fat Rats'::tsvector;
      tsvector     
--------------------
 'Fat' 'The' 'Rats'
但是对于英文全文检索应用来说,上面的句子就是非标准化的,但是tsvector是不会知道的,为处理加工的文本应该通过使用to_tsvector函数来是之规格化,标注化的应用于搜索.

SELECT to_tsvector('english', 'The Fat Rats');        
   to_tsvector  
-----------------
 'fat':2 'rat':3


tsquery

顾名思义,tsquery,表示的应该是查询相关的.tsquery是存储用于检索的词条.并且可以联合使用boolean 操作符来连接, & (AND), | (OR), and ! (NOT). 使用括号(),可以强制分为一组.


 SELECT 'fat & rat'::tsquery;
    tsquery   
---------------
 'fat' & 'rat'

SELECT 'fat & (rat | cat)'::tsquery;
          tsquery         
---------------------------
 'fat' & ( 'rat' | 'cat' )

SELECT 'fat & rat & ! cat'::tsquery;
        tsquery        
------------------------
 'fat' & 'rat' & !'cat'
同时,tsquery 在做搜索的时候,也可以使用权重,并且每个词都可以使用一个或者多个权重标记,这样在检索的时候,会匹配相同权重的信息.
跟上面的tsvector ,相同tsquery也有一个to_tsquery函数.

全文检索的 document

document就是全文检索的搜索单元,在postgresql中全文检索匹配操作使用@@ 操作符,如果一个
tsvector(document) 匹配到 tsquery(query)则返回true.

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
 ?column?
----------
 t
我们在处理索引的时候还是要使用他们的函数如,
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
 ?column?
----------
 t
并且操作符 @@ 可以使用text作为tsvector和tsquery.如下操作符可以使使用的方法

tsvector @@ tsquery
tsquery  @@ tsvector
text @@ tsquery
text @@ text
上面的前两种我们已经使用过了,但是后两种,
text @@ tsquery 等同于 to_tsvector(x) @@ y.
而 text @@ text 等同于 to_tsvector(x) @@ plainto_tsquery(y).

表和索引

前面介绍了如何在简单文本中进行全文检索匹配.下面部分将介绍如何检索表数据和使用索引.

检索一个表

在全文检索中不使用索引也是可以进行检索的,例如下面的简单例子,查询出title 从所有body中包含friend的行.

SELECT title
FROM pgweb
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');

复杂一点的例子:
检索出最近的10个文档,在表中的title 和 body字段中包含 creat和table的titile.
SELECT title
FROM pgweb
WHERE to_tsvector(title || body) @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC LIMIT 10;

建立索引

我们可以通过创建gin索引来加速检索速度.例如

CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body));

创建索引可以有多种方式.索引的创建甚至可以连接两个列:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || body));
另外的一种方式是创建一个单独的 tsvector列,然后使用to_tsvector函数把需要索引字段的数据联合在一起,比如列title和body,并且使用函数coalesce来确保字段为NULL的可以建立索引。
如下:
ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector;
UPDATE pgweb SET textsearchable_index_col =
     to_tsvector('english', coalesce(title,'') || coalesce(body,''));
然后,我们就可以创建倒排的索引
CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);
索引创建完毕,我们就可以使用全文检索了。
SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC LIMIT 10;

 

控制全文检索(Controlling Text Search)

为了实现全文检索,我们需要把一个文档创建一个tsvector 格式,并且通过tsquery实现用户的查询。
因此,在查询中我们返回一个按照重要性排序的查询结果。

分析文档(Parsing Documents)

postgresql 中提供了to_tsvector函数把文档处理成tsvector数据类型。(前面已经介绍过了)
这个函数会将文本文档,分解成唯一的词条,并且还包括词条所在文本中的位置。(这里to_tsvector函数就不再多做介绍了)。
其实在做分词是很重要的步骤,分词的操作直接关系到你的后来检索的结果。(后面再重要描述)
在postgreSQL中默认的to_tsvector('english',)配置默认的是英语。
postgre 中还有一个函数 setweight ,要使用这个函数我们要引入一个概念,这个概念就是权重weight,什么是权重呢,字面上解释就是权衡一下哪个更重要,也就是说哪个更侧重一些。我们可以通过函数setweight来设置权重,postgre提供了四个A,B,C,D来分别表示不同权重级别,这个级别类型用来标记他们来自于文档中的不同部分,例如title和body。查询结果的关注度可以使用这个权重级别。如:
UPDATE tt SET ti =
    setweight(to_tsvector(coalesce(title,'')), 'A')    ||
    setweight(to_tsvector(coalesce(keyword,'')), 'B')  ||
    setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
    setweight(to_tsvector(coalesce(body,'')), 'D');

搜索分析(Parsing Queries)

postgreSQL中提供了to_tsquery函数和plainto_tsquery函数,来处理分析搜索语句。

SELECT to_tsquery('english', 'The & Fat & Rats');
  to_tsquery  
---------------
 'fat' & 'rat'

在搜索中tsquery中可以使用权重(weight),在搜索词条中可以附加权重,并且匹配出来的查询结果也是必须在这个这个权重范围的。

SELECT to_tsquery('english', 'Fat | Rats:AB');
    to_tsquery   
------------------
 'fat' | 'rat':AB

从上面的例子可以看出,to_tsquery函数在处理查询文本的时候,查询文本的单个词之间要使用逻辑操作符(& (AND), | (OR) and ! (NOT))连接(或者使用括号)。例如 跟上面的例子相似

SELECT to_tsquery('english', 'Fat  Rats');

如果要使执行上面的操作,就会报语法错误。
然而plainto_tsquery函数却可以提供一个标准的tsquery,如上面的例子,plainto_tsquery会自动加上逻辑&操作符。
SELECT plainto_tsquery('english', 'Fat  Rats');

 plainto_tsquery
-----------------
 'fat' & 'rat'
但是plainto_tsquery函数不能够识别逻辑操作符和权重标记。
SELECT plainto_tsquery('english', 'The Fat & Rats:C');
   plainto_tsquery  
---------------------
 'fat' & 'rat' & 'c'

查询结果关注度(Ranking Search Results)

相关度,就是试图测试衡量哪一个文档是检索中最关注的。因此我们把最匹配的文档现在在最前面。这样才能真正达到检索的准确度,postgresql提供两个相关的函数,ts_rank和ts_rank_cd.
这两个函数的语法是
ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4

ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4

两个函数的第一个参数都是 权重(weight),在前面已经讲了权重的概念。
参数的格式为 {D-weight, C-weight, B-weight, A-weight} ,在使用函数的时候没有指定这个参数,postgre会默认指定参数为:{0.1, 0.2, 0.4, 1.0}
这个参数应该理解为:单前检索的关键词(词条)在当前这个检索文档中的位置,如果这个词条在这个当前的位置权重高,那么他的相关度的值也会高。
另外函数的最好一个参数是一个整型,这个参数是表示,这个参数指定文档大小影响相关度的程度。
你可以指定一个或者多个例如(2|4)。
这些参数的定义

0 (the default) ignores the document length
表示跟长度大小没有关系
1 divides the rank by 1 + the logarithm of the document length
表示参数 关注度(rank)除以 文档长度的对数+1
2 divides the rank by the document length
表示 关注度 除以 文档的长度
4 divides the rank by the mean harmonic distance between extents (this is implemented only by ts_rank_cd)
表示 关注度 除以 文档长度的平均值,只能使用函数ts_rank_cd.
8 divides the rank by the number of unique words in document
表示 关注度 除以 文档中 唯一分词的数量
16 divides the rank by 1 + the logarithm of the number of unique words in document
表示关注度 除以 唯一分词数量的对数+1
32 divides the rank by itself + 1
表示 关注度 除以 本身+1


其他的一些特性

       length(vector tsvector) returns integer
    这个函数返回当前索引字段的分词长度,就是分词的个数

       strip(vector tsvector) retzitor
这个函数返回当前索引字段的数据不包括词的位置


自动更新处理的触发器(Triggers for Automatic Updates)

在我们作全文检索的时候,当我们使用单独的列来存储索引文件的时候,我们一定需要创建一个触发器,当涉及索引字段的其他列的内容改变的时候,索引文件也要相应的改变,postgre提供两个触发器可以实现该功能,也可以自定义触发器。

这两个触发器的为:
    tsvector_update_trigger(tsvector_column_name, config_name, text_column_name [, ... ])
    tsvector_update_trigger_column(tsvector_column_name, config_column_name, text_column_name [, ... ])

这个函数可以自动把一个或者多个文本字段,计算生成索引字段。例如

我们创建一个表
CREATE TABLE messages (
    title       text,
    body        text,
    tsv         tsvector//索引字段
);

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
创建触发器,字段title和body都是文本字段,他们索引后的字段为tsv,这里使用postgre自带的分词规则pg_catalog.english。
向表中插入一条数据。
INSERT INTO messages VALUES('title here', 'the body text is here');

SELECT * FROM messages;
   title    |         body          |            tsv            
------------+-----------------------+----------------------------
 title here | the body text is here | 'bodi':4 'text':5 'titl':1
可以看到tsv字段自动加入的数据,并且经过tsvector处理。
接下来我们测试一下检索
SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body');
上面这个查询,查不到结果。
SELECT title, body FROM messages WHERE tsv @@ to_tsquery('english','title & body');
   title    |         body         
------------+-----------------------
 title here | the body text is here
注意: 看上面的查询条件,在进行全文检索的时候,在创建索引时,使用的分词方式,与检索时使用的分词方式一定要想同,否则查询的结果就会有问题。

创建触发器后,不论title或者body那个字段改变,都会自动反射给tsv,索引会自动更新。

上面这中自带的触发器很有局限性,比如说,在建立索引的时候title和body要有不同的权重,上面的触发器就能达到我们想要的效果,下面是一个 pl/pgsql 触发器。

CREATE FUNCTION messages_trigger() RETURNS trigger AS $$
begin
  new.tsv :=
     setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')), 'A') ||
     setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')), 'D');
  return new;
end
$$ LANGUAGE plpgsql;

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();

索引统计函数

 ts_stat(sqlquery text, [ weights text, ] OUT word text, OUT ndoc integer, OUT nentry integer)

返回的是统计的纪录

word text — 索引中的词条

ndoc integer — 词条在索引中出现的次数

nentry integer — 词条在文档中出现的总次数

例如:

SELECT * FROM ts_stat('SELECT tsv FROM messages')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;

查询的结果为

  word     ndoc  nentry

  test     2      3
  title    2      2
  test     1      2
  body     1      1

上面可以看到,通过ts_stat函数就可以看到索引列中的分词的情况。

 

词典(Dictionaries)

词典就是被用来过滤掉一些不被关注的词(在检索的时候),并且对词句规格化,是为了相同的词在不同的来源的文档中可以被匹配。一个成功分词(格式化的)的词称为词条。除了能提高检索的质量外,分词的规格化,过滤词,还能够减少文档索引的大小,这样可以提高性能。标准化的词也不能总是符合语言学意义,并且总是依赖于应用所在的环境。
简单举例:
例如一些颜色名称,将会被替换成其相对应的16进制的值,如 red,green,blue ->FF0000, 00FF00, 0000FF 等。
如果要制定小数,我们可以去掉一些小数的位数,来减少范围。如 3.14159265359 ,3.1415926,这两个小数如果是保留小数点后两位小数,那么格式化后他们的值将都是 3.14。

postgresql提供了一些预定义的词典面向多种语言的,并且还有几个预定义的模版,可以根据用户的需要自定义词典。

屏蔽词(Stop Words)
stop words 是一个很普遍并且在每个文档中几乎都能出现的的词,并且这个词没有实际的意义,因此在全文检索的文档中他么将被忽略。例如 英文文本内容中单词 像 a 和like,他们不需要存储在索引中,但是他会影响词所在文档的位置。
SELECT to_tsvector('english','in the list of stop words');
        to_tsvector
----------------------------
 'list':3 'stop':5 'word':6
并且相关度的计算与是否存在stop words是十分不同的,如:
SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
       0.05

SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
        0.1

简单词典

使用简单词典,自定义词典,如:

CREATE TEXT SEARCH DICTIONARY public.simple_dict (
    TEMPLATE = pg_catalog.simple,
    STOPWORDS = english
);

上面例子中的 english是表示的stop words的名字,这个stop words的全名因该是$sharedir/tsearch_data/english.stop,$sharedir也就是postgresql的安装目录下.现在我们使用一下新建的词典.如:
SELECT ts_lexize('public.simple_dict','YeS');
 ts_lexize
-----------
 {yes}

SELECT ts_lexize('public.simple_dict','The');
 ts_lexize
-----------
 {}
还有几个postgresql中自带的词典, Simple Dictionary,Synonym Dictionary
,Thesaurus Dictionary
,Ispell Dictionary
,Snowball Dictionary
这里不再详细介绍了.

 


全文检索的测试和调试

ts_debug函数用来调试全文检索的

这个函数显示的是文档的每个词条通过基本词典的分析和处理的信息。
这个函数返回的信息为:
alias text — short name of the token type
文本别名-词的类型名称
description text — description of the token type
描述-描述词的类型
token text — text of the token
词内容-词的文本内容
dictionaries regdictionary[] — the dictionaries selected by the configuration for this token type
词典-词的配置所选择的词典
dictionary regdictionary — the dictionary that recognized the token, or NULL if none did
词典
lexemes text[] — the lexeme(s) produced by the dictionary that recognized the token, or NULL if none did; an empty array ({}) means it was recognized as a stop word
处理后的词条

Here is a simple example:

SELECT * FROM ts_debug('english','a fat  cat sat on a mat - it ate a fat rats');
   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes
-----------+-----------------+-------+----------------+--------------+---------
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | cat   | {english_stem} | english_stem | {cat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | sat   | {english_stem} | english_stem | {sat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | on    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | mat   | {english_stem} | english_stem | {mat}
 blank     | Space symbols   |       | {}             |              |
 blank     | Space symbols   | -     | {}             |              |
 asciiword | Word, all ASCII | it    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | ate   | {english_stem} | english_stem | {ate}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | rats  | {english_stem} | english_stem | {rat}


分析器测试(ts_parse)

ts_parse函数分析文档并且返回一串记录,每一个解析后的词都有一个tokid,和的分词。如

SELECT * FROM ts_parse('default', '123 - a number');
 tokid | token
-------+--------
    22 | 123
    12 |
    12 | -
     1 | a
    12 |
     1 | number


gist 和 gin的索引类型(GiST and GIN Index Types)

这两种索引都能用在提高全文检索的速度,注意全文检索不一定非要使用索引,但是万一当一个字段被固定规律搜索时,使用索引将会有很好的效果。

CREATE INDEX name ON table USING gist(column);
创建索引 gist 索引字段的类型可以是 tsvector 或者 tsquery.
 
CREATE INDEX name ON table USING gin(column);
创建索引 gin 索引字段的类型必须是 tsvector;

 

分享到:
评论

相关推荐

    MySQL中文参考手册

    * 0 译者序 * 1 MySQL的一般的信息 o 1.1 什么是MySQL?... # 7.3.7.2 BLOB和TEXT类型 # 7.3.7.3 ENUM类型 # 7.3.7.4 SET类型 + 7.3.8 为列选择正确的类型 + 7.3.9 列索引 + 7.3.10 多列索引 +...

    MYSQL

    8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的组间...

    MySQL中文参考手册.chm

    8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的...

    RSMA-Rate-Splitting-通信系统仿真-速率拆分

    《RSMA与速率拆分在有限反馈通信系统中的MMSE基预编码实现》 本文将深入探讨RSMA(Rate Splitting Multiple Access)技术在有限反馈通信系统中的应用,特别是通过MMSE(Minimum Mean Square Error)基预编码进行的实现。速率拆分是现代多用户通信系统中一种重要的信号处理策略,它能够提升系统的频谱效率和鲁棒性,特别是在资源受限和信道条件不理想的环境中。RSMA的核心思想是将用户的数据流分割成公共和私有信息两部分,公共信息可以被多个接收器解码,而私有信息仅由特定的接收器解码。这种方式允许系统在用户间共享信道资源,同时保证了每个用户的个性化服务。 在有限反馈通信系统中,由于信道状态信息(CSI)的获取通常是有限且不精确的,因此选择合适的预编码技术至关重要。MMSE预编码是一种优化策略,其目标是在考虑信道噪声和干扰的情况下最小化期望平方误差。在RSMA中,MMSE预编码用于在发射端对数据流进行处理,以减少接收端的干扰,提高解码性能。 以下代码研究RSMA与MMSE预编码的结合以观察到如何在实际系统中应用RSMA的速率拆分策略,并结合有限的反馈信息设计有效的预编码矩阵。关键步骤包括: 1. **信道模型的建立**:模拟多用户MIMO环境,考虑不同用户之间的信道条件差异。 2. **信道反馈机制**:设计有限反馈方案,用户向基站发送关于信道状态的简化的反馈信息。 3. **MMSE预编码矩阵计算**:根据接收到的有限反馈信息,计算出能够最小化期望平方误差的预编码矩阵。 4. **速率拆分**:将每个用户的传输信息划分为公共和私有两部分。 5. **信号发射与接收**:使用预编码矩阵对信号进行处理,然后在接收端进行解码。 6. **性能评估**:分析系统吞吐量、误码率等性能指标,对比不同策略的效果。

    【地理空间Python教程】使用XEE从Google Earth Engine下载图像:肯尼亚人口网格数据GeoTIFF文件生成方法介绍了如何使用XEE

    内容概要:本文档介绍了如何使用 XEE 包从 Google Earth Engine 下载图像数据并保存为 GeoTIFF 文件。主要内容包括:1) 使用新的 ee.data.getPixels() API 和 XEE 包简化了从 GEE 提取大型数据集的过程;2) 通过 XArray 数据集和 rioxarray 工具直接处理和保存图像数据,避免了复杂的导出任务;3) 具体示例展示了如何下载肯尼亚 2021 年的 LandScan 人口网格数据,包括环境搭建、数据准备、图像处理和最终保存为 GeoTIFF 文件。 适合人群:具备一定 Python 编程基础和地理信息系统(GIS)知识的开发者或研究人员,特别是对地理空间数据分析和遥感图像处理感兴趣的用户。 使用场景及目标:① 在基于 Python 的工作流中快速高效地提取和处理托管在 GEE 上的大规模地理空间数据;② 学习如何使用 XEE 包和相关工具进行地理空间数据的下载、裁剪、投影转换和保存;③ 通过实际案例掌握地理空间数据的处理技巧,提高数据处理效率和准确性。 其他说明:此教程提供了详细的代码示例和操作步骤,帮助用户在 Google Colab 环境中完成整个数据下载和处理过程。用户需要具备一定的 Python 编程能力,并熟悉常用的地理空间数据处理工具和库,如 geopandas、rioxarray 和 xarray。此外,教程还强调了数据版权和来源的重要性,确保用户合法合规地使用数据。

    基于STM32的工业级锅炉控制器系统设计:外设驱动、数据采集与通信协议实现

    内容概要:本文详细介绍了基于STM32F407的锅炉控制器系统设计,涵盖多个关键技术点。首先,在SD卡驱动方面,采用了硬件SPI配置,波特率为10.5MHz,并通过DMA发送80个空时钟进行初始化。其次,多路AD采集使用差分输入模式和DMA循环采集,配合滑动平均滤波提高效率。此外,Modbus通信部分通过结构体映射寄存器并使用硬件CRC单元进行校验。文件系统则采用FatFs结合SPI Flash缓存,确保断电保护。实时监控线程使用状态机设计,确保系统稳定性和安全性。硬件设计方面,模拟电路与数字电路分区布局,增强抗干扰能力。 适合人群:具备一定嵌入式开发基础的研发人员,特别是希望深入了解工业级项目设计的工程师。 使用场景及目标:适用于工业自动化领域的嵌入式系统开发,旨在帮助工程师掌握从硬件选型、外设驱动、数据采集到通信协议实现的全流程设计方法,提升系统的可靠性和实时性。 其他说明:文中提供了详细的代码示例和设计思路,强调了实际项目中的注意事项和常见问题解决方案,有助于读者快速上手并应用于实际项目中。

    基于MATLAB的配电网二阶锥优化:OLTC档位选择与123型支路的最优潮流研究

    内容概要:本文详细介绍了基于MATLAB实现的配电网二阶锥最优潮流研究,重点探讨了OLTC(有载调压变压器)档位选择和123型支路的优化方法。通过构建SOCP(二阶锥规划)模型,结合YALMIP和CPLEX求解器,实现了高效的潮流优化。文中提供了详细的代码示例和解释,涵盖系统参数定义、模型构建、约束添加以及求解过程。此外,还讨论了OLTC档位选择的离散变量建模、支路类型的差异化处理、动态优化的时间轴管理等方面的技术细节。 适合人群:对电力系统优化感兴趣的科研人员、研究生及有一定编程基础的工程师。 使用场景及目标:适用于配电网优化研究和实际工程应用,旨在提高潮流计算的效率和准确性,解决传统方法在复杂约束下的不足。通过学习本文,读者可以掌握如何利用MATLAB和相关工具进行二阶锥优化,从而更好地应对电力系统中的各种挑战。 其他说明:文章附带详细的代码注释和讲解视频,帮助读者快速理解和应用所介绍的方法和技术。

    临时网盘、企业内部共享网盘

    前端将文件切片上传服务器返回提取码,前端通过输入提取码下载文件。 编写语言php,html,js 运行环境要求:windows 10专业版64位,Apache2.4.39,PHP7.4.3nts,MySQL5.7.26。

    【Python开发】VSCode配置Python开发环境全流程:从安装到调试与依赖管理

    内容概要:本文档详细介绍了在Visual Studio Code (VSCode)中配置Python开发环境的步骤。首先,需安装Python并确保它被添加到系统的环境变量中,接着安装VSCode及其官方Python扩展,还可以安装Pylance、Jupyter等可选扩展来增强功能。然后,配置Python解释器,推荐创建和使用虚拟环境以隔离项目依赖。配置调试环境包括创建`launch.json`文件,以便能顺利运行和调试代码。此外,还应安装代码格式化和Lint工具如pylint、autopep8或black,并在VSCode的设置中启用它们,以保证代码质量和一致性。最后,文档提供了关于如何运行和调试代码以及管理项目依赖的方法,并列举了一些常见问题及解决办法。; 适合人群:初学者或有一定经验的Python开发者,希望在VSCode中搭建高效Python开发环境的人员。; 使用场景及目标:①为新项目搭建完整的Python开发环境;②优化现有开发环境,提高开发效率;③解决VSCode中Python开发遇到的基本问题。; 阅读建议:按照文档步骤顺序操作,确保每一步都成功完成再进行下一步,特别是要注意安装过程中的一些细节选项,如将Python添加到环境变量等。对于遇到的问题,可以参考文档最后列出的常见问题解答。

    基于西门子200Smart的凸轮飞剪控制系统设计与实现

    内容概要:本文详细介绍了基于西门子200Smart PLC的凸轮飞剪控制系统的设计与实现。主要内容涵盖硬件配置(如主轴编码器、伺服电机、触摸屏)、关键PLC编程技巧(如同步触发逻辑、高速中断处理、加减速曲线配置)、以及现场调试经验(如温度补偿、方向控制、误差处理)。文中特别强调了同步触发逻辑和加减速曲线对系统稳定性的影响,并分享了多个实用的调试技巧和技术难点解决方案。 适合人群:具备PLC编程基础的技术人员,特别是从事自动化控制领域的工程师。 使用场景及目标:适用于工业生产线中需要高精度同步控制的应用场景,如包装机、切割机等。目标是帮助技术人员理解和掌握凸轮飞剪系统的实现方法,提高生产效率和产品质量。 其他说明:文中提供了大量具体的代码示例和调试经验,有助于读者快速上手并应用于实际项目中。同时,文中提到的一些优化措施(如温度补偿、编码器断线检测等)对于提升系统的可靠性和稳定性具有重要价值。

    汇川H5U运动控制框架模板:高效、模块化的工业自动化解决方案

    内容概要:本文介绍了汇川H5U运动控制框架模板的特点及其应用场景。该框架提供了高度模块化的设计,使得伺服轴控、气缸控制以及与爱普生机器人的EIP通讯变得极为简便。框架内置了丰富的功能块(FB),如AxisControl_FB用于伺服轴控制,Cylinder_FB用于气缸控制,EpsonEIP_Data用于机器人通信。这些FB块不仅简化了编程流程,还集成了诸如互锁保护、超时检测等功能,极大提高了开发效率和系统稳定性。此外,框架支持结构体嵌套应用,便于参数管理和在线修改,确保项目的灵活性和可扩展性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些希望提高开发效率、减少重复劳动的人群。 使用场景及目标:适用于各种运动控制项目,如流水线自动化、机器人控制等。主要目标是帮助工程师快速搭建稳定的控制系统,缩短开发周期,降低调试难度,提升系统的可靠性和性能。 其他说明:框架内的注释详尽且为中文,非常适合初学者理解和学习。对于有经验的工程师而言,该框架同样提供了一个高效的开发平台,能够显著提升工作效率。

    含绿证交易与碳排放优化的智能楼宇微网调度模型

    内容概要:本文介绍了一个复杂的电热综合能源系统优化调度模型,该模型不仅涵盖了传统的风光储火微网,还包括了电动汽车和智能楼宇单元。模型通过线性规划求解最优调度方案,同时考虑了碳市场和绿色证书交易市场的影响。代码实现了微网各单元的初始化、优化调度的核心算法以及碳市场和绿色证书交易的成本调整。此外,模型还涉及了多时间尺度的优化问题处理、热电耦合约束、市场交易机制的设计等方面。 适用人群:从事能源优化、微网调度研究的专业人士,尤其是对碳市场和绿色证书交易感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要进行复杂微网系统优化调度的研究和应用场合,旨在降低总成本并减少碳排放,提高能源利用效率。具体目标包括优化风光储火微网的调度策略,最大化绿色证书收益,最小化碳交易成本,提升电动汽车和智能楼宇的调度灵活性。 其他说明:该模型展示了如何通过引入碳市场和绿色证书交易机制来改善微网系统的性能,提供了详细的代码实现和理论解释,有助于理解和实践相关领域的前沿技术。

    基于改进粒子群算法的园区综合能源优化调度:含电动汽车参与的MATLAB实现

    内容概要:本文详细介绍了基于改进粒子群算法的园区综合能源优化调度方法及其MATLAB代码实现。文中首先分析了园区综合能源系统中的三个主要市场交易主体:系统能源运营商、分布式光伏用户和电动汽车充电代理商。接着,通过定义各主体的相关参数,建立了综合能量管理优化策略。然后,采用改进的粒子群算法对模型进行了求解,展示了粒子群算法的初始化、适应度函数定义及优化过程。最后,通过具体算例验证了该方法的有效性,特别是在冬季典型场景下的表现。文章强调了电动汽车在能源调度中的重要作用,以及改进粒子群算法在处理光伏出力突变等复杂场景时的优势。 适合人群:从事能源管理系统研究的技术人员、研究生及以上学历的科研工作者、对MATLAB编程有一定基础的学习者。 使用场景及目标:适用于希望深入了解园区综合能源系统优化调度方法的研究人员和技术人员。目标是掌握如何通过改进粒子群算法实现含电动汽车参与的能源优化调度,提高能源利用效率,降低成本。 其他说明:文章提供了详细的代码示例和解释,帮助读者更好地理解和实现该方法。同时,文中提到的多个改进点和注意事项也为进一步研究提供了方向。

    某全域旅游大数据信息系统建设方案Word(38页).docx

    在探索智慧旅游的新纪元中,一个集科技、创新与服务于一体的整体解决方案正悄然改变着我们的旅行方式。智慧旅游,作为智慧城市的重要分支,旨在通过新一代信息技术,如云计算、大数据、物联网等,为游客、旅游企业及政府部门提供无缝对接、高效互动的旅游体验与管理模式。这一方案不仅重新定义了旅游行业的服务标准,更开启了旅游业数字化转型的新篇章。 智慧旅游的核心在于“以人为本”,它不仅仅关注技术的革新,更注重游客体验的提升。从游前的行程规划、信息查询,到游中的智能导航、个性化导览,再到游后的心情分享、服务评价,智慧旅游通过构建“一云多屏”的服务平台,让游客在旅游的全过程中都能享受到便捷、个性化的服务。例如,游客可以通过手机APP轻松定制专属行程,利用智能语音导览深入了解景点背后的故事,甚至通过三维GIS地图实现虚拟漫游,提前感受目的地的魅力。这些创新服务不仅增强了游客的参与感和满意度,也让旅游变得更加智能化、趣味化。 此外,智慧旅游还为旅游企业和政府部门带来了前所未有的管理变革。通过大数据分析,旅游企业能够精准把握市场动态,实现旅游产品的精准营销和个性化推荐,从而提升市场竞争力。而政府部门则能利用智慧旅游平台实现对旅游资源的科学规划和精细管理,提高监管效率和质量。例如,通过实时监控和数据分析,政府可以迅速应对旅游高峰期的客流压力,有效预防景区超载,保障游客安全。同时,智慧旅游还促进了跨行业、跨部门的数据共享与协同合作,为旅游业的可持续发展奠定了坚实基础。总之,智慧旅游以其独特的魅力和无限潜力,正引领着旅游业迈向一个更加智慧、便捷、高效的新时代。

    工业自动化中变频器频率与线速度转换的Python实现及优化

    内容概要:本文详细介绍了如何将变频器的输出频率转换为实际线速度的方法及其Python实现。首先给出了基本的数学公式和基础版本的Python代码,然后逐步引入了单位换算、异常处理、移动平均滤波等优化措施。此外,还讨论了如何通过Modbus协议与PLC通信获取实时频率数据,并强调了参数准确性的重要性。文中提供了多个测试案例,展示了不同应用场景下的计算方法和注意事项。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是需要进行变频器相关工作的人员。 使用场景及目标:适用于需要精确控制生产线速度的各种场合,如包装生产线、输送系统等。主要目标是帮助工程师快速准确地计算并监控变频器驱动的传送带或其他机械设备的实际运行速度。 其他说明:文章不仅提供了具体的代码实现,还分享了许多实用的经验和技巧,如参数校验、单位转换、异常处理等,有助于提高系统的稳定性和可靠性。同时,作者还提到可以通过图形化界面或HMI设备进一步提升用户体验。

    工业自动化中恒压供水系统的西门子200 SMART与ABB ACS510变频器控制逻辑解析

    内容概要:本文详细介绍了基于西门子200 SMART PLC和ABB ACS510变频器构建的恒压供水系统。该系统实现了泵数量自适应、时间轮换机制、频率控制、故障替换逻辑以及多段压力控制等功能。文中通过具体的梯形图和结构化文本(ST)代码片段解释了各个功能模块的工作原理和技术细节。例如,泵数量自适应通过VB100寄存器动态调整泵的数量;时间轮换机制利用指针寻址和环形队列确保泵的均匀使用;频率控制采用PID调节,并提供PLC和变频器两种PID控制方式的选择;故障替换逻辑设有‘三次重试’机制,保障系统的可靠性;多段压力控制则通过环形缓冲区存储24小时压力设定值,优化能源消耗。此外,系统还采用了频率滞回比较算法和平滑过渡策略,使得管网压力波动保持在较小范围内。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和变频器应用有一定基础的人群。 使用场景及目标:适用于中小型项目的恒压供水系统设计与实施。主要目标是提高系统的灵活性、可靠性和能效,减少设备磨损,降低运维成本。 其他说明:文中提到的一些具体实现方法如指针寻址、环形队列、PID参数设置等,对于理解和掌握现代工业控制系统具有重要价值。同时,文中提供的代码片段可以直接用于实际工程中,帮助工程师快速搭建高效稳定的恒压供水系统。

    MATLAB环境中基于最大重叠离散小波变换的ECG信号处理与多领域应用

    内容概要:本文详细介绍了在MATLAB环境下使用最大重叠离散小波变换(MODWT)对心电信号(ECG)进行处理的方法。首先解释了MODWT的基本概念及其相对于传统离散小波变换的优势,特别是在处理ECG信号时能够保持平移不变性。接着阐述了具体的处理流程,包括删除伪影、滤波降噪以及检测PQRST波并确定心跳等步骤。文中提供了详细的MATLAB代码示例,展示了如何通过选择合适的小波基和分解层数来优化信号处理效果。此外,还讨论了该算法在金融时间序列、地震信号和其他生理信号处理中的广泛应用潜力。 适合人群:从事生物医学信号处理的研究人员和技术爱好者,尤其是那些希望深入了解ECG信号处理原理的人群。 使用场景及目标:适用于需要精确分析一维时间序列信号的各种应用场景,如医疗诊断系统中ECG信号的自动分析,金融市场趋势预测,地震预警系统的信号处理等。目标是提高信号处理精度,减少噪声干扰,从而获得更加可靠的数据支持决策。 其他说明:文中提到的一些具体参数设置(如阈值的选择),可以根据实际情况灵活调整。同时提醒读者,在处理长时间连续记录的信号时需要注意内存管理问题。

    超表面全息技术中MIM结构的高效几何相位与FDTD仿真解析

    内容概要:本文详细介绍了基于金-氟化镁-金(MIM)结构的超表面全息技术,特别是其高效的几何相位调制和FDTD仿真方法。文章首先解释了MIM结构的独特之处,即通过磁偶极子模式降低辐射损耗,从而显著提高转换效率。接着,文章展示了如何使用FDTD Solutions进行建模,包括设置材料参数、纳米柱尺寸以及应用周期性边界条件。此外,还讨论了几何相位的计算方法及其在相位调制中的应用,并提供了具体的MATLAB代码示例。对于GS算法的应用,文中提出了改进措施以加快收敛速度并提高全息图的质量。最后,文章强调了在效率验证过程中需要注意的技术细节,如正确配置功率监视器和考虑边界效应。 适合人群:从事超表面研究、光学工程、纳米技术和电磁仿真的研究人员和技术人员。 使用场景及目标:适用于希望深入了解MIM结构在超表面全息领域的应用,掌握高效几何相位调制和FDTD仿真的具体实现方法的研究人员。目标是帮助读者理解并复现实验室级别的高效率超表面全息系统。 其他说明:文章不仅提供了详细的理论背景,还包括了大量的代码片段和实践经验,有助于读者更好地理解和应用相关技术。

    示波器基础知识.pdf### 示波器础知识总结

    内容概要:本文档详细介绍了示波器的基础知识,包括其工作原理、分类、关键组件(如CRT、偏转系统、触发系统等)以及各种控制功能。文章首先解释了示波器与普通电压表的区别,强调了示波器能以图形方式显示电压随时间的变化。接着深入探讨了模拟示波器的构造和工作方式,如垂直和水平偏转系统、灵敏度控制、耦合方式、带宽、上升时间等。随后介绍了数字存储示波器(DSO)的特点,包括数字存储、采样和数字化、预触发和后触发、峰值检测等功能。文档还对比了模拟示波器和DSO的优缺点,指出组合示波器兼具两者优势。最后,文档讨论了探头的工作原理、类型及其它附件和软件,帮助用户选择合适的示波器和探头。 适用人群:电子工程师、技术人员、科研人员以及对示波器有兴趣的学习者。 使用场景及目标:①理解示波器的工作原理和基本构造;②掌握模拟示波器和数字存储示波器的操作方法及应用场景;③选择合适的示波器和探头进行电路测试和信号分析;④利用示波器的高级功能(如预触发、峰值检测、自动测量等)提高工作效率。 其他说明:本文档不仅提供了理论知识,还结合实际应用案例,帮助读者更好地理解和使用示波器。文档内容详尽,涵盖了从基础到高级的各种知识点,适合不同层次的读者学习和参考。

    力士乐伺服系统IndraWorks Ds调试技巧与参数优化详解

    内容概要:本文详细介绍了力士乐伺服调试软件IndraWorks Ds 14V24 P5与15V16版本的调试经验和参数优化方法。主要内容涵盖参数映射规则、PID增益设置、通讯配置、心跳检测脚本、速度环调试、轴参数互锁机制、VBA脚本应用、XML配置管理、实时曲线对比、参数备份策略等方面。特别强调了不同版本之间的兼容性和特殊调试技巧,如惯量比设置、加速度斜坡时间调整、动态磁链补偿等。此外,还提供了多个实用的调试工具和技术细节,帮助工程师提高工作效率并解决常见问题。 适合人群:从事伺服控制系统调试的技术人员、自动化工程师以及相关领域的研究人员。 使用场景及目标:适用于力士乐伺服系统的安装、调试和维护过程中,旨在帮助工程师快速掌握关键调试技巧,优化系统性能,减少调试时间和错误发生率。 其他说明:文中提供的具体参数设置和脚本代码均经过实际验证,能够显著提升调试效果。建议读者结合自身应用场景灵活运用这些技术和经验。

Global site tag (gtag.js) - Google Analytics