从安装Elasticsearch到导入数据
最近,我开始在工作中使用Elasticsearch。为了备忘,我决定记录下我使用和学习的从数据插入到评分的过程中的经验。
由于全文比较长,我将分为前后两篇来写。
前篇将从安装开始到数据输入,
而后篇则将讨论搜索和评分的内容。
安装
首先,我们要安装必要的软件。
开发环境使用的是CentOS7操作系统。
弹性搜索至少需要Java 8。具体来说,在撰写本文时,建议您使用Oracle JDK版本1.8.0_73。
需要Java版本为8或更高版本。
Java的安装
首先要安装Java 8。
您可以参考此链接进行操作。
如果已经安装了旧版本的Java 1.7,上述链接中也说明了如何切换Java虚拟机的方法。
可以删除Java7并重新安装Java8。
$ sudo yum remove -y java-1.7.0-openjdk
$ sudo yum install -y java-1.8.0-openjdk-devel
$ sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*
检查版本
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
安装Elasticsearch。
在Yum中可以安装的是2.x的旧版本。
因为在这里我们使用Elasticsearch5.0,所以要安装Elasticsearch5.0。
(最近好像也发布了6版本。)
安装可以按照Elasticsearch文档中的步骤进行,但是启动却没有成功。 ( ;∀;)
另一种方法是通过rpm安装。(目前,无法通过rpm安装6版本。)
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install elasticsearch
# systemctl enable elasticsearch
# systemctl start elasticsearch
起動了吗?可以测试一下吗?
# curl localhost:9200
{
"name" : "3Y-W_H1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "cYenb8Q8S22EHcxJPL7k2Q",
"version" : {
"number" : "5.0.0",
"build_hash" : "253032b",
"build_date" : "2016-10-26T04:37:51.531Z",
"build_snapshot" : false,
"lucene_version" : "6.2.0"
},
"tagline" : "You Know, for Search"
}
你成功启动了。
Kibana的安装
参考Elastic Doc。
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/kibana.repo
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install kibana
# systemctl enable kibana
# systemctl start kibana
我要设置连接。
# vim /etc/kibana/kibana.yml
network.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
# systemctl restart kibana
让我们在浏览器中打开它吧。
请将以下内容用中文进行表达:http://192.168.216.128:5601
成功解決了!(´∀`)
安装Kuromoji
让我们也安装一个用于日语分析的插件吧。
# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
# systemctl restart elasticsearch
# curl -X GET 'http://localhost:9200/_nodes/plugins?pretty'
…
"plugins" : [
{
"name" : "analysis-kuromoji",
"version" : "5.0.0",
"description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
"classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin"
}
],
…
附加品
在中国有Elastic Cloud的云版本(提供14天免费试用期)。
Elastic不使用自己的服务器,而是使用AWS的服务器。
虽然完全在浏览器中进行GUI操作很方便,但无法进入服务器的后台(CUI)也是不方便的。
使用Python进行数据输入。
因为想要尝试使用kuromoji,所以将导入Twitter信息并进行日语分析。
因为想要尝试使用kibana的地图功能,所以将投入地震信息进行试验。
1. 分析Twitter上的信息
因为对于Twitter等收集信息的事情了解不多,所以会参考这里的内容继续进行。
# python -V
Python 3.5.2 :: Anaconda 4.1.1 (64-bit)
首先,安装所需的软件包。
# pip install twitter
# pip install elasticsearch
映射
与 SQL 类似,Elasticsearch 也需要在事先确定数据结构,并将数据插入其中。
Elasticsearch 的数据结构是以索引-类型-标识(index-type-id)的形式存在的。
在插入数据时,需要指定索引和类型,而标识则可以不指定。
在这种情况下,会自动产生一个22位的UUID。
可以使用curl进行映射,但我认为在Kibana的Dev Tools中更方便。
PUT /twi_index
{
"settings":{
"index":{
"analysis":{
"tokenizer" : {
"kuromoji" : {
"type" : "kuromoji_tokenizer",
"mode" : "search"
}
},
"analyzer" : {
"japanese" : {
"type": "custom",
"tokenizer" : "kuromoji",
"filter" : ["pos_filter"]
}
},
"filter" : {
"pos_filter" : {
"type" : "kuromoji_part_of_speech",
"stoptags" :["接続詞","助詞","助詞-格助詞","助詞-格助詞-一般","助詞-格助詞-引用","助詞-格助詞-連語","助詞-接続助詞","助詞-係助詞","助詞-副助詞","助詞-間投助詞","助詞-並立助詞","助詞-終助詞","助詞-副助詞/並立助詞/終助詞","助詞-連体化","助詞-副詞化","助詞-特殊","助動詞","記号","記号-一般","記号-読点","記号-句点","記号-空白","記号-括弧開","記号-括弧閉","その他-間投","フィラー","非言語音"]
}
}
}
}
},
"mappings": {
"twi_type":{
"properties":{
"created_at" : {
"type" : "date"
},
"text" : {
"type" : "text",
"analyzer": "japanese",
"fielddata": true
},
"track": {
"type": "keyword"
}
}
}
}
}
在设置中定义分析器。
由于需要对文本进行保存并进行日文分析,因此需要指定分析器,用于Twitter内容保存。
由于不需要分析track,因此将类型指定为关键词。
以下是参考的Kuromoji设置方法。
在这里,我们将使用Kuromoji词性过滤器来排除特定的词性(助词、格助词、符号)。
数据输入
我几乎完整地使用了yoppe先生的脚本。
我稍微修改过的脚本已上传到了Github上。
成果
发现 – 选择track。
可视化 – 饼图 – twi_index
因为在那一天(16/11/11),电视上播出了《红猪》这部电影,因此在Twitter上成为了热门话题。( ´∀` )
– 其他
– 可以使用GET _aliases来检查索引列表。
– 关于字段数据类型
– 在2.x版本中,文本数据类型使用string类型,但从5.x版本开始变为text和keyword类型。
只能通过确切的值进行搜索的是关键字字段。
如果你需要索引结构化内容,比如电子邮件地址、主机名、状态码或标签,很可能你应该使用关键字字段。
這個文本用於進行分析,關鍵詞則用於需要完全匹配搜索的情況下使用。
最后,我们来确认一下,既然已经用上了Kuromoji,看看它产生的效果吧。
虽然情况微妙,但稍微好转了一些。
嗯,在Twitter上流传的信息中有很多专有名词,如果不定义用户词典,分析就会变得困难。
2. 震动信息
使用的信息源是由P2P地震信息提供的JSON API。
地圖映射
PUT /earthquakes
{
"mappings": {
"earthquake": {
"properties": {
"time": {
"type": "date",
"format":"yyyy/MM/dd HH:mm:ssZ"
},
"place": {
"type": "text"
},
"location": {
"type": "geo_point"
},
"magnitude": {
"type": "float"
},
"depth": {
"type": "float"
}
}
}
}
}
数据输入
这个脚本我已经放在了Github上。
其实是我半年前写的代码。
虽然可以执行,但有些地方不太对劲。
如果有时间,我会进行修正。
结果
让我们在 Kibana 中确认一下。
第一部分到此为止。
我正在考虑分析什么样的数据来进行后续搜索和评分。