elasticsearch

由于工作原因,需要对爬取下来的新闻进行全文实时检索,简单调研后选择elasticsearch完成该功能。

elasticsearch单机版安装

选择docker方式进行安装。选择镜像进行拉取

1
docker pull daocloud.io/library/elasticsearch:5.4.2-alpine

启动容器后台运行

1
docker run -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" --name elasticsearch daocloud.io/library/elasticsearch:5.4.2-alpine

安装python api操作elasticsearch

1
pip3 install elasticsearch

python api 操作说明

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
28
29
30
31
from elasticsearch import Elasticsearch

# 建立索引,其中news为Type,可以理解为分组,对应python api中的arg doc_type,最好一个索引只含有一个type7.x版本elasticsearch据说会取消Type。index_mappings为索引所需要保存的json文件的key-value结构,也就是properties中内容。
es = Elasticsearch()
index_mappings = {
"mappings": {
"news": {
"properties": {
"url": {"type": "text"},
"title": {"type": "text"},
"publish": {"type": "string""index": "not_analyzed"},
"content": {"type": "text"},
}
}
}
}

if not es.indices.exists('defensenews'):
es.indices.create('defensenews', body=index_mappings)

# 向索引中插入数据
item = {}
item['url'] = url
item['title'] = title
item['publish'] = publish
item['content'] = content
es.index('defensenews', doc_type='news', body=item)

# 全文检索,查询content中包含radar的记录,_source指定需要获取的字段名
res = es.search("defensenews", doc_type='news', body={"query": {"match": {"content": "radar"}}}, _source=['title'])
print(res)

对于中文,需要安装ik分词插件(该docker中是否已经集成未测试),在index_mappings中需要指定中文分词器,具体见参考链接。

时间类型处理

elasticsearch会识别一定格式的字符串,并自动将之转为时间类型。

至于什么样的字符串es会认为可以转换成date类型,参考elasticsearch官网介绍

kibana在读取es数据时如果数据不带时区信息则会当成零时区,并根据系统时区自动对数据进行时间转换,因此

所以最佳实践方案就是:我们在往es提交日期数据的时候,直接提交带有时区信息的日期字符串,如:“2016-07-15T12:58:17.136+0800”。

inferences

全文搜索引擎 Elasticsearch 入门教程

python操作Elasticsearch (一、例子)

Elasticsearch Date类型使用技巧