原本是打算把数据存储到MongoDB,然后再同步到Elasticsearch。

但后来考虑到这样做代价太高,毕竟数据本身就不重要,完全是从零网复制的而已。

因此我好几次删库,毫不犹豫的那种

Elasticsearch

Elasticsearch: The Definitive Guide

查到的资料和博客基本上落后好几个主版本,应该除了参考文档,只有这个可看了。

下面用 Kibana的/app/kibana#/dev_tools/console 操作ES。

Analyzer

这个用于分析文本,建了索引。

分析文本有三步:

  • 清理文本,删除HTML标记等。(char_filter)
  • 分词 (tokenizer)
  • 过滤词,去除无用词,更改大小写等 (filter)

一个用于英文的自定义分析器例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": ["&=> and "]
}
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": ["the", "a"]
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": ["html_strip", "&_to_and"],
"tokenizer": "standard",
"filter": ["lowercase", "my_stopwords"]
}
}
}
}
}

定义analyzer之后才可以使用

1
2
3
4
5
GET /my_index/_analyze
{
"text": "The quick & brown fox",
"analyzer": "my_analyzer"
}

Mappings

类似于数据库模式(Schema)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /gb 
{
"mappings": {
"properties" : {
"tweet" : {
"type" : "string",
"analyzer": "english"
},
"date" : {
"type" : "date"
},
"name" : {
"type" : "string"
},
"user_id" : {
"type" : "long"
}
}
}
}

针对指定字段测试分析器。

1
2
3
4
5
GET /gb/_analyze
{
"field": "tweet",
"text": "Black-cats"
}

中文分析器

依据star数,选定elasticsearch-analysis-ik作为分析器。

由于我用apt装的es,故cd入/usr/share/elasticsearch/bin,再

1
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.0.0/elasticsearch-analysis-ik-7.0.0.zip

重启ES

1
2
3
4
5
6
7
8
9
10
11
12
PUT /sites
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}

试一下

1
2
3
4
5
GET /sites/_analyze
{
"field": "content",
"text": "IPFS和ZeroNet零网哪个好"
}

插入文档

1
2
3
4
POST /sites/_doc/my_site
{
"content": "IPFS和ZeroNet零网哪个好"
}

OK,一切正常。

剩下的就是要重写爬虫数据库部分。