搜索引擎优化高级编程( 优化空间不足使用sego索引的方法及注意事项 )

优采云 发布时间: 2022-04-16 08:41

  搜索引擎优化高级编程(

优化空间不足使用sego索引的方法及注意事项

)

  使用 PostgreSQL 作为搜索引擎

  最近,我正在研究使用 PostgreSQL 作为搜索引擎。简而言之,搜索引擎主要使用倒排索引,即先将一个文章或语句分词,再将文章分为N个词,每个词都有一定的权重。这一步有很多地方可以优化。将文章分成意义准确的分词,对后续搜索有很大的影响。您可以参考 TF-IDF 或 TEXTRANK。算法; 第二步,建立倒排索引,即将分词与该词在文章中的位置相关联;有了倒排索引,第三步就是搜索了,同样的,我们输入分词,组装成一定的搜索条件,放到搜索引擎中搜索;

  但是,业界常用的搜索引擎都是ES,我为什么要使用PG?在海量数据的情况下,ES 可能是更好的搜索方案,但总的来说,ES 太重了。PG能胜任常见的情况吗?如果我们的业务数据和搜索可以通过PG处理,那么数据库和ES之间就不需要同步了,整体复杂度会大大降低。

  这就是我做这个尝试的原因。

  PG 内部支持

  在PostgreSQL(简称PG,下同)中使用全文索引,需要使用PG提供的内置数据结构tsvector:

  A tsvector value is a sorted list of distinct lexemes, which are words that have been normalized to merge different

variants of the same word (see Chapter 12 for details). Sorting and duplicate-elimination are done automatically

during input, as shown in this example:

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

tsvector

----------------------------------------------------

'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'

  tsvector用于存储分词向量,我们来看一个简单的例子:

  # SELECT tokens FROM cargos;

'一':66B,70B '一部分':68B,72B '上':35B '不是':62B '两极':29B '两极分化':31B '中国':44B,54B '丰':19B '丰衣足食':22B...

  可以看出这里就是我们前面提到的倒排索引,每一个都是由一个词和词的位置组成的。其中的A和B实际上是单词的权重。PG有ABCD的4个权重,A的权重最高。D 最低。权重越高,在后续搜索中的排名就越高。

  建立倒排索引

  得到文章后,我们需要先进行分词。我用sego,因为gojieba总是莫名其妙的panic,所以为了简单,我先用sego。如果发现sego优化空间不足,那么可以使用jieba。Python 版本被打包为服务并提供。

  我的数据库设计为:

  这应该适用于大部分场景,比如搜索文章、商品、歌词、帖子等。代码如下:

<p>var (

titleWords []string

descriptionWords []string

)

for _, i := range sego.SegmentsToSlice(segmenter.Segment([]byte(cargo.Title)), true) {

if len(i)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线