从安装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

キャプチャ.PNG

成功解決了!(´∀`)

安装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。

SQLMongoElasticDBDBindextablecollectiontype

可以使用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上。

成果

aaa.png

发现 – 选择track。
可视化 – 饼图 – twi_index

bbb.png

因为在那一天(16/11/11),电视上播出了《红猪》这部电影,因此在Twitter上成为了热门话题。( ´∀` )

– 其他
– 可以使用GET _aliases来检查索引列表。
– 关于字段数据类型
– 在2.x版本中,文本数据类型使用string类型,但从5.x版本开始变为text和keyword类型。

只能通过确切的值进行搜索的是关键字字段。
如果你需要索引结构化内容,比如电子邮件地址、主机名、状态码或标签,很可能你应该使用关键字字段。

這個文本用於進行分析,關鍵詞則用於需要完全匹配搜索的情況下使用。

最后,我们来确认一下,既然已经用上了Kuromoji,看看它产生的效果吧。

eee.png
ccc.png

虽然情况微妙,但稍微好转了一些。
嗯,在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 中确认一下。

ddd.png

第一部分到此为止。
我正在考虑分析什么样的数据来进行后续搜索和评分。

广告
将在 10 秒后关闭
bannerAds