尝试在有趣的服务中引入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也是一样的。

广告
将在 10 秒后关闭
bannerAds