尝试在有趣的服务中引入Elasticsearch的总结
首先
我们有一个可以热闹地进行有趣活动的服务。现在讨论要给这项服务添加一个搜索功能。
发现最新的受欢迎的Web服务和应用程序的Service Safari
这项服务是由策展人每天发布的新服务,用户可以在应用程序、网页或电子邮件中查看。尽管目前可以通过名称或标签进行搜索,但本次要求是希望增加多个标签的搜索功能,并添加全文搜索功能用于介绍文本。考虑到MySQL可能困难,所以决定尝试使用Elasticsearch。
-
- サービス名の部分一致で検索できる
-
- サービス紹介文の全文検索ができる
-
- 複数のタグでの検索ができる
- サービスURLのドメインで検索ができる
我们的目标是能够在上述项目中进行复合搜索。
可能会有一些完全不熟悉Elasticsearch的初学者所做的事情是错误的。请事先谅解m(__)m
在VPS上建立环境。
安装Elasticsearch
安装本身非常简单,可以使用yum命令完成。需要Java环境。
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
# yum install java
# yum install elasticsearch
安装插件
Elasticsearch提供了插件机制,可以轻松安装以下三种插件。
analysis-kuromoji: 日本語を全文検索用
elasticsearch-analysis-url: URL解析用
elasticsearch-kopf: 管理画面
# cd /usr/share/elasticsearch/
# bin/plugin install analysis-kuromoji
# bin/plugin install lmenezes/elasticsearch-kopf/v2.1.1
# bin/plugin install https://github.com/jlinn/elasticsearch-analysis-url/releases/download/v5.0.0.0/elasticsearch-analysis-url-5.0.0.0.zip
根据GitHub页面等参考,需要安装时,似乎需要调整版本等,否则安装将失败。
Elasticsearch的基础知识
安装完成后,学习Elasticsearch的基础知识。
用語和概念
Elasticsearch系统概述 – 你好!Elasticsearch。– Medium
阅读这篇文章以后,你会有种大概明白的感觉。要点就是,
-
- Index: RDBのデータベース
-
- Type: RDBのテーブル
- Document: RDBのレコード
— 这个问题非常有意思,我觉得值得深入研究。
-
- Cluster: Elasticsearchのプロセスの集合体(Nodeの集まり)
-
- Node: Elasticsearchプロセスの1つ1つ
- Shard: Indexを物理領域的に分割したもの
“In order to succeed, your desire for success should be greater than your fear of failure.”
-
- Filter: 与えられた文字列を前後処理するもの。例えばスペースを取り除くなど。
-
- Tokenizer: 与えられた文字列を分割するもの。分割した文字列でインデックスが作成される。例えばURLを受け取って、ドメインに分割するなど。
- Analyzer: FilterとTokenizerを組み合わせた処理機構。
这样的感觉是吗?说实话,关于设置多少个节点和碎片才合适,我完全不知道。在我试验的例子中,我使用了两个节点,但由于这只是个娱乐服务,所以在正式运营中可能只使用一个节点。
关于指数设计的问题
设计 Elasticsearch 索引定义的步骤 – $shibayu36->博客
这篇文章非常有参考价值。总之,它提供了预期的输入。
-
- どのように整形するか
- どのように分割するか
考虑这种事情,并将其转化为设置的工作。
设定
Elasticsearch的配置。
我随意地写了一下,变成了这样的感觉。
-
- network.bind_host: ElasticsearchがbindするIPアドレスで複数設定できる。
-
- network.publish_host: これは同クラスタの他のノードと通信するようのIPアドレス(たぶん)
-
- discovery.zen.ping.unicast.hosts: 同クラスタの他のノードのIP(もっとスマートな方法はないものか)
- index以下はアナライザーの設定になります
这次假设有2个节点,所以我们将在两台服务器上进行相同的设置,只需修改 discovery.zen.ping.unicast.hosts。关键是不要忘记在防火墙中打开9200和9300端口。另外,对于正常运行而言,我认为不需要打开全局IP。
cluster.name: service-safari
node.name: ss1
network.bind_host: ["グローバルIP", "プライベートIP"]
network.publish_host: "プライベートIP"
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["クラスタリングするサーバのプライベートIP"]
index :
analysis :
analyzer :
ja :
type : custom
tokenizer : ja_tokenizer
char_filter : [
html_strip,
kuromoji_iteration_mark
]
filter : [
lowercase,
cjk_width,
katakana_stemmer,
kuromoji_part_of_speech
]
ja_ngram :
type : custom
tokenizer : ngram_ja_tokenizer
char_filter : [html_strip]
filter : [
cjk_width,
lowercase
]
url_host:
tokenizer: url_host
tokenizer :
ja_tokenizer :
type : kuromoji_tokenizer
mode : search
# user_dictionary : /etc/elasticsearch/userdict_ja.txt
ngram_ja_tokenizer :
type : nGram
min_gram : 2
max_gram : 3
token_chars : [letter, digit]
url_host:
type: url
part: host
filter :
katakana_stemmer :
type : kuromoji_stemmer
索引设置
サービスサファリという名前のIndexを作る場合
PUT /servicesafari
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1"
}
},
"mappings": {
"posts": {
"_source": {
"enabled": false
},
"_all": {
"enabled": false
},
"properties": {
"name": {
"analyzer": "ja_ngram",
"type": "string"
},
"tags": {
"type": "string"
},
"description": {
"analyzer": "ja_ngram",
"type": "string"
},
"url": {
"type": "string",
"analyzer": "url_host"
},
"related_links": {
"type": "string",
"analyzer": "url_host"
},
"created_at": {
"format": "YYYY-MM-dd HH:mm:ss",
"type": "date"
}
}
}
}
}
注册数据
POST /servicesafari/posts/1
{
"created_at" : "2016-11-01 12:00:00",
"name": "サービスサファリ - ServiceSafari",
"description": "最新のサービスが知れるメディアです。",
"tags": ["メディア", "ポータル"],
"url": "http://www.service.safari.com",
"related_links": [
"https://www.producthunt.com/",
"https://techcrunch.com/",
"http://eiei19.hatenablog.com/"
]
}
数据搜索
POST /servicesafari/posts/_search
{
"query":{"match":{"name":"Service"}}
}
这篇文章对这方面的资料很有参考价值。
通过比较Elasticsearch和SQL来理解 – Qiita
尝试使用Elasticsearch的布尔查询编写AND OR NOT – Qiita
批量导入或者其他批量操作
{ "create" : { "_index" : "ss", "_type" : "posts", "_id" : "1" } }
{ "created_at" : "2016-11-01 12:00:00", "name": "サービスサファリ - ServiceSafari", "description": "最新のサービスが知れるメディアです。", "url": "http://www.service.safari.com", "related_links": [ "https://www.producthunt.com/", "https://techcrunch.com/", "http://eiei19.hatenablog.com/" ]}
{ "create" : { "_index" : "ss", "_type" : "posts", "_id" : "2" } }
{ "created_at" : "2016-11-01 12:00:00", "name": "Yahoo Japan", "description": "昔からある老舗のポータル", "url": "http://yahoo.co.jp", "related_links": [ "http://news.yahooo.com", "http://nifty.com", "http://google.co.jp" ]}
curl -s -XPOST http://IPアドレス:9200/_bulk --data-binary "@requests.json"; echo
应该阅读官方文件。
批量API | Elasticsearch 参考文档 [5.0] | Elastic
概括
我总结了以上的Elasticsearch配置。只需在应用程序端设置好操作机制,就可以使用了。
发现最新热门的Web服务和应用的服务探险
Service Safari是一个兴趣的服务,我们正在寻找与我们一起开发和服务增长的成员。欢迎没有经验的人,如果您有兴趣,请联系 @eiei19。Twitter也是一样的。