安装Elasticsearch并尝试使用日文全文搜索

因为这个人太热,所以我会写。

版本

弹性搜索2.1.1

安装之类的。

    • serverはcentos7

 

    • java はyum install java

yum confの設定

/etc/yum.repos.d/elasticsearch.repo
[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 elasticsearchで2系の最新がインストールできます
他の方法でinstallしたい場合は公式を参照してください

日本語の全文検索に必要なpluginをinstall

cd /usr/share/elasticsearch/
bin/plugin install analysis-kuromoji

管理画面的なものを入れる(kopf)

bin/plugin install lmenezes/elasticsearch-kopf/v2.1.1

kopfはこちらを参照。
合うバージョンとか見てinstallするとはまらない

インストールされてるか確認

[root@xxx ~]# ll /usr/share/elasticsearch/plugins/
合計 8
drwxr-xr-x. 2 root root 4096 1月 12 00:08 analysis-kuromoji
drwxr-xr-x. 8 root root 4096 1月 12 00:33 kopf

Elasticsearch的内部机制等

alt
    1. 当在索引和搜索过程中,原始字符会经过称为Char filters的地方进行处理。

 

    1. 根据需要,会进行过滤。(不一定需要)

 

    1. 使用Tokenizer来定义分词方法(如Kuromoji或ngram)。

 

    1. 使用Token filters来过滤经过分词的字符。

 

    根据需要,会进行过滤。(不一定需要)

Elasticsearch 的配置设置(仅限于索引部分)。

# ---------------------------------- Index -----------------------------------
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
                ]
        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]
        filter :
            katakana_stemmer :
                type : kuromoji_stemmer
    • kuromojiを使ったindexとngramを用いたインデックスをしたかったので「analyzer」と「tokenizer」を設定

 

    試しにuser_dictionary : /etc/elasticsearch/userdict_ja.txtで独自辞書を設定

索引的模板设置

curl -XPUT localhost:9200/_template/projects03 -d '

{
  "order": 0,
  "template": "projects03-*",
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "0"
    }
  },
  "mappings": {
    "project": {
      "_source": {
        "enabled": true
      },
      "_all": {
        "analyzer": "ja",
        "enabled": true
      },
      "properties": {
        "update_time": {
          "format": "YYYY-MM-dd HH:mm:ss",
          "type": "date"
        },
        "project_id": {
          "index": "not_analyzed",
          "type": "string"
        },
        "detail": {
          "analyzer": "ja",
          "type": "string"
        },
        "suggest": {
          "search_analyzer": "ja",
          "analyzer": "ja",
          "type": "completion"
        },
        "detail_ngram": {
          "analyzer": "ja_ngram",
          "type": "string"
        },
        "title": {
          "analyzer": "ja",
          "type": "string"
        },
        "title_ngram": {
          "analyzer": "ja_ngram",
          "type": "string"
        }
      }
    }
  },
  "aliases": {

  }
}'
    • kopfの管理画面からでも登録可能

 

    • テストだったのでnumber_of_shards number_of_replicasを最小値へ

 

    • suggest機能も試したかったので設定

 

    色々な人の設定を参考にしました

由于已完成Elasticsearch的配置,因此进行了更新。

[root@xxx ~]# /etc/init.d/elasticsearch restart
Restarting elasticsearch (via systemctl):                  [  OK  ]

尝试输入数据流

使用Shell或简单的程序来利用curl传输

curl -X POST http://localhost:9200/projects03-20160111/project/<id>  -d '
{
    "project_id": 1,
    "title" : "川島さんこんにちわ",
    "title_ngram" : "川島さんこんにちわ",
    "detail" : "内容内容内容内容",
    "detail_ngram" : "内容内容内容内容",
    "update_time" : "2016-01-28 22:22:22"
}
'
    のところをユニークな数値で入れていくと_idに入るので効率的です。

那我来试试搜索吧

请在被Kuromoji索引的数据中进行搜索。

[root@xxx ~]# curl -XGET 'localhost:9200/projects03-20160111/project/_search?pretty' -d'
> {
>  "query":{"match":{"title":"こんに"}}
> }'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

在「こんに」处没有搜寻结果。

curl -XGET 'localhost:9200/projects03-20160111/project/_search?pretty' -d'
> {
>  "query":{"match":{"title":"こんにちわ"}}
> }'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.15342641,
    "hits" : [ {
      "_index" : "projects03-20160111",
      "_type" : "project",
      "_id" : "1",
      "_score" : 0.15342641,
      "_source":
{
    "project_id": 1,
    "title" : "川島さんこんにちわ",
    "title_ngram" : "川島さんこんにちわ",
    "detail" : "内容内容内容内容",
    "detail_ngram" : "内容内容内容内容",
    "update_time" : "2016-01-28 22:22:22"
}

    } ]
  }
}

你好的搜索结果

这是

curl -XGET 'localhost:9200/projects03-20160111/_analyze?analyzer=ja&pretty' -d 'こんにちわ'
{
  "tokens" : [ {
    "token" : "こんにちわ",
    "start_offset" : 0,
    "end_offset" : 5,
    "type" : "word",
    "position" : 0
  } ]
}

因为被索引为「こんにちわ」这个词。

请在已建立ngram索引的地方进行搜索。

curl -XGET 'localhost:9200/projects03-20160111/project/_search?pretty' -d'
> {
>  "query":{"match":{"title_ngram":"こんに"}}
> }' 
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.13287117,
    "hits" : [ {
      "_index" : "projects03-20160111",
      "_type" : "project",
      "_id" : "1",
      "_score" : 0.13287117,
      "_source":
{
    "project_id": 1,
    "title" : "川島さんこんにちわ",
    "title_ngram" : "川島さんこんにちわ",
    "detail" : "内容内容内容内容",
    "detail_ngram" : "内容内容内容内容",
    "update_time" : "2016-01-28 22:22:22"
}

    } ]
  }
}

由于是ngram,因此用“こんに”可以找到。

请注意、需要注意的地方、我的感想

    • Centos7からiptablesでなくfirewalldになってた

 

    • elastsearchはデフォルトで外部に公開されないので同じNW内またはlocalにloginしてcurlでapiを叩く

 

    • kopfはelasticsearchが入ってるサーバでないと入らないので管理サーバだけ別サーバみたいなのが無理っぽい

 

    • kuromojiにすでに入ってるオプション?の利用だけで結構事足りる気がする

_souceは要件によっては削って全然おk

广告
将在 10 秒后关闭
bannerAds