建立全文索引

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} p {mso-style-noshow:yes; mso-style-priority:99; mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} span.top11 {mso-style-name:top11; mso-style-unhide:no;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

 转载自:http://www.cnblogs.com/chorrysky/archive/2007/09/05/882939.html


微软的SQL Server数据库是一个在中低端企业应用中占有广泛市场的关系型数据库系统,它以简单、方便、易用等特性深得众多软件开发人员和数据库管理人员的钟爱。 SQL Server 7.0以前的数据库系统由于没有全文检索功能,致使无法提供像文本内容查找此类的服务,成为一个小小的遗憾。从SQL Server 7.0起,到如今的SQL Server 2000终于具备了全文检索功能,使用户可以高效地检索存储在数据库charvarchartextntextncharnvarchar等数 据类型列中的文本数据。
建立全文索

在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称):

1. 启动数据库的全文处理功能(sp_fulltext_database);

2.
建立全文检索目录(sp_fulltext_catalog);

3.
在全文检索目录中注册需要全文索引的表(sp_fulltext_table);

4.
指出表中需要全文检索的列名(sp_fulltext_

column);


5.
为表创建全文索引(sp_fulltext_table);

6.
填充全文检索目录(sp_fulltext_catalog)

下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。

use test //
打开数据库

//
打开全文索引支持,启动SQL Server的全文搜索服务

execute sp_fulltext_database ‘enable’

//
建立全文检索目录ft_test

execute sp_fulltext_catalog ‘ft_test’, ‘create’

Title列建立全文索引数据元,pk_titleBook表中由主键所建立的唯一索引,这个参数是必需的。


注意:这里的pk_title是主键或唯一键的索引名,而非列名

execute sp_fulltext_table ‘book’
‘create’, ‘ft_test’‘pk_title’

//
设置全文索引列名

execute sp_fulltext_column ‘book’, ‘title’, ‘add’

execute sp_fulltext_column ‘book’
‘notes’, ‘add’

//
建立全文索引

execute sp_fulltext_table ‘book’, ‘activate’

//
填充全文索引目录

execute sp_fulltext_catalog ‘ft_test’, ‘start_full’

至此,全文索引建立完毕。

进行全文检索

SQL Server 2000
提供的全文检索语句主要有CONTAINSFREETEXTCONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。

CONTAINS
语句的语法格式为:

CONTAINS({column | *}),

_condition>)

其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_

condition
说明CONTAINS语句的搜索内容,其语法格式为:

{||||}[{{AND|AND NOT|OR}}] [...n]

下面就simple_termprefix_term参数做简要说明:

simple_term
CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为:

{‘word’|“ phrase”}

prefix_term
说明CONTAINS语句所搜索的字或短语前缀,其格式为:

{“word*” | “phrase*”}

例如,下面语句检索Book表的Title列和Notes列中包含“database”“computer”字符串的图书名称及其注释信息:

select title, notes

from book

where contains(tilte, ‘database’) or contains(notes
‘database’)

or contains(title
‘computer’) or contains(notes‘computer’)

FREETEXT
语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。

FREETEXT
语句的语法格式为:FREETEXT({column | * }‘freetext_string’)

其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。

例如,下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行:

select title, notes

from book

where freetext(*
‘Successful Life’)

 

<think>我们正在讨论ApacheDoris中的全文索引功能。根据引用资料,ApacheDoris在2.0.0版本中实现了高性能的倒排索引(即全文索引),这大大提升了文本搜索的效率。在ApacheDoris中,全文索引是通过倒排索引实现的,它支持对字符串类型的列进行全文检索。创建全文索引的步骤如下:1.在创建表时指定倒排索引:在需要建立全文索引的列上使用`INDEX`关键字,并指定索引类型为`INVERTED`。2.或者,在已有表上通过ALTERTABLE语句添加倒排索引。下面分别给出两种方法的示例:###方法一:建表时创建全文索引```sqlCREATETABLEfulltext_table(idBIGINT,titleVARCHAR(50),contentVARCHAR(200),--在content列上创建倒排索引(全文索引)INDEXcontent_idx(content)USINGINVERTED)ENGINE=OLAPDUPLICATEKEY(id)DISTRIBUTEDBYHASH(id)BUCKETS10PROPERTIES("replication_num"="1");```###方法二:在已有表上添加全文索引假设已有表`fulltext_table`,现在要在`content`列上添加倒排索引:```sqlALTERTABLEfulltext_tableADDINDEXcontent_idx(content)USINGINVERTED;```注意:添加索引是一个异步操作,可以通过以下命令查看索引构建进度:```sqlSHOWALTERTABLEINDEX;```###使用全文索引进行查询创建全文索引后,可以使用`MATCH`关键字进行全文检索:```sqlSELECT*FROMfulltext_tableWHEREMATCH(content,'keyword');```或者使用更复杂的查询:```sqlSELECT*FROMfulltext_tableWHEREMATCH(content,'ApacheORDoris');```###配置说明-倒排索引支持自定义分词器(目前支持英文分词、中文分词等)。在创建索引时可以指定分词器参数,例如:```sqlINDEXcontent_idx(content)USINGINVERTEDPROPERTIES("parser"="chinese")```支持的分词器包括:*`english`(默认):英文分词,按照空格和标点符号分词。*`chinese`:中文分词,使用内置的中文分词器。*`unicode`:按照Unicode字符分词(按字符切分)。*也可以不指定,则使用默认的`english`分词器。-倒排索引还支持其他配置,如是否启用大小写敏感(`case_sensitive`)等。###注意事项-全文索引(倒排索引)在Doris2.0及以上版本中支持。-倒排索引在写入时会增加一定的开销,但能极大提升文本检索的查询性能。-倒排索引支持字符串类型(VARCHAR/STRING)和文本类型(TEXT)。通过使用倒排索引,ApacheDoris能够高效地处理全文检索场景,结合其原有的OLAP能力,可以实现日志分析、内容搜索等复杂场景的一体化处理,从而大幅降低存储成本并提升查询性能[^1][^2][^3]。§§相关问题§§1.ApacheDoris的倒排索引支持哪些类型的分词器?2.如何查看全文索引的构建进度?3.全文索引对写入性能有多大影响?4.除了全文索引,ApacheDoris还有哪些索引类型?5.在哪些场景下适合使用全文索引?</think>### 在 Apache Doris 中创建全文索引(倒排索引) Apache Doris 从 **2.0 版本**开始支持高性能倒排索引(全文索引),以下是创建和配置步骤: --- #### 1. **创建表时定义倒排索引** ```sql CREATE TABLE article_db.articles ( id BIGINT, title VARCHAR(255), content TEXT, -- 在 content 列创建倒排索引 INDEX content_idx (content) USING INVERTED ) ENGINE=OLAP DISTRIBUTED BY HASH(id) PROPERTIES ( "replication_num" = "3", -- 副本数 "inverted_index_storage_format" = "V1" -- 索引存储格式 ); ``` **关键参数:** - `USING INVERTED`:指定索引类型为倒排索引 - `inverted_index_storage_format`:索引存储格式(V1/V2) --- #### 2. **已有表添加倒排索引** ```sql ALTER TABLE article_db.articles ADD INDEX title_idx (title) USING INVERTED; ``` **查看索引构建进度:** ```sql SHOW ALTER TABLE INDEX; -- 检查索引创建状态 ``` --- #### 3. **配置分词器(支持中文)** ```sql ALTER TABLE article_db.articles ADD INDEX content_idx (content) USING INVERTED PROPERTIES("parser" = "chinese"); -- 指定中文分词器 ``` **支持的分词器类型:** - `chinese`:中文分词(默认细粒度) - `english`:英文分词(空格分隔) - `unicode`:按Unicode字符切分 - 可通过 `"parser_mode" = "fine_grained|coarse_grained"` 调整中文分词粒度 --- #### 4. **使用全文索引查询** ```sql -- 基础匹配查询 SELECT * FROM articles WHERE MATCH(content, '数据库优化'); -- 多条件组合查询 SELECT * FROM articles WHERE MATCH(content, 'Doris OR 索引') AND MATCH(title, '性能'); ``` --- #### 5. **性能优化建议** 1. **冷热分离** 结合冷热数据分层存储(2.0+特性),热数据SSD存放索引: ```sql PROPERTIES ( "storage_policy" = "hot_data:SSD;cold_data:HDD" ); ``` 2. **索引压缩** 启用ZSTD压缩减少存储(实测可降低存储空间80%[^1]): ```sql PROPERTIES("compression" = "ZSTD"); ``` 3. **异步构建索引** 大数据量时异步构建避免阻塞写入: ```sql ALTER TABLE articles BUILD INDEX content_idx BUILD_DEFERRED; ``` --- #### 实际效果验证 根据生产环境测试: - **写入速度**:日志场景比Elasticsearch提升4倍[^1][^2] - **查询性能**:复杂文本检索提速2-11倍[^1][^3] - **存储成本**:相同数据量降低70%-80%[^1][^2][^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值