fulltext详解
随着互联网的发展,数据呈指数级增长,我们急需高效的搜索算法,来找到我们所需的信息。其中一个重要的算法就是fulltext。在本文中,我们将从多个方面对fulltext进行详细的阐述。
一、fulltext是什么?
1、fulltext的定义
FULLTEXT()
函数用于在MySQL数据库表的TEXT列中查找一个或多个单词的文本。该功能使MySQL可以使用自然的语言查询:这意味着用户可以键入针对表中数据的问题,就像在其他搜索引擎中一样。
2、fulltext的带来的优势
相比于普通字符串匹配,fulltext的优势主要在于:
- 在一些大型的表中,效率更高
- 搜索条件更灵活,可以匹配多个关键词
- 可以忽略常见词,如“a”“and”“the”等,从而提高搜索的精确度
二、fulltext和数据库的集成
1、在MySQL中使用fulltext
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);
2、在PostgreSQL中使用fulltext
CREATE INDEX idx_articles_fts ON articles USING gin(to_tsvector('english', body));
3、在MongoDB中使用fulltext
db.articles.createIndex({title:"text", body:"text"})
三、fulltext和搜索引擎的结合
1、接入Elasticsearch
PUT /articles
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"stemmer"
]
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
},
"body": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
2、接入Solr
<fieldtype name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PorterStemFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PorterStemFilterFactory" />
</analyzer>
</fieldtype>
四、fulltext的优化和注意事项
1、优化
- 查询优化:尽量使用基于满足查询条件的最小结果集来建立索引
- 存储优化:fulltext索引占用的磁盘空间较大,需要在存储时进行优化
- 分词优化:需要避免错误的词组合
2、注意事项
- fulltext并不能解决所有的搜索问题,请根据实际场景进行使用
- fulltext只能在某些具有该特性的数据库中使用
- 需要进行不同数据库中fulltext的语法调整 本文简单介绍了fulltext在搜索方面的优势,并结合MySQL、PostgreSQL、MongoDB以及搜索引擎如Elasticsearch和Solr的使用进行阐述。在使用时需要注意优化和一些注意事项。