ubuntu 下 使用 elasticsearch5 同义词

Wesley13
• 阅读 624

1. 安装最新版 elasticsearch

参考: https://www.elastic.co/guide/en/elasticsearch/reference/5.2/deb.html

依次执行以下命令

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

sudo apt-get install apt-transport-https

echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

sudo apt-get update && sudo apt-get install elasticsearch

查看自己系统用的是 SysV 还是 systemd

ps -p 1

我用的是 systemd 执行

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service

2.  启动 elasticsearch

sudo service elasticsearch start

3. 检查是否安装成功

curl -XGET 'localhost:9200/?pretty'

如果返回结果类似以下内容,说明安装成功

{
  "name" : "Cp8oag6",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA",
  "version" : {
    "number" : "5.2.2",
    "build_hash" : "f27399d",
    "build_date" : "2016-03-30T09:51:41.449Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

4. 配置同义词

elasticsearch5 的默认目录是 /etc/elasticsearch,所以在 /etc/elasticsearch 目录下创建同义词文件

edit /etc/elasticsearch/analysis/synonyms.txt

输入同义词(每行一组),注意文件必须要是 utf-8 格式,英文逗号

中文,汉语,汉字,
2室1厅1卫,2室2厅1卫=>二居室,
1室1厅1卫=>一居室,一室
3室2厅1卫,三居室,

其中包含 => 的同义词是在 analysis 时只生成 => 后面的词,应该比较省内存,不知道缺点是什么.

5. 安装分词插件

elasticsearch 默认是没有汉语词组的,所以要用这个插件

https://github.com/medcl/elasticsearch-analysis-ik/releases

下载和 elasticsearch 匹配的版本,解压缩到 elasticsearch 的 plugins 目录下的 ik 文件夹中,比如我的是 /usr/share/elasticsearch/plugins/ik

6. 配置自定义词组

我们用到的词语有些是 ik 中已有的,比如 中文/汉语/汉字,有些是没有的,比如 一居室/二居室,没有的就要自己配置了

gedit /usr/share/elasticsearch/plugins/ik/config/custom/mydict.dic

添加自定义词组到文件中

2室1厅1卫
2室2厅1卫
二居室
1室1厅1卫
一居室
3室2厅1卫
三居室

安装/修改插件,需要重启 elasticsearch 才会生效

sudo service elasticsearch stop
sudo service elasticsearch start 

7. 检测自定义分词是否有效

curl -XGET 'http://localhost:9200/gj/_analyze?pretty&analyzer=by_smart' -d '{"text":"一居室"}

8. 创建 index

准备工作已经做好了,现在可以在代码中使用同义词了,这里用 php 演示一下

        $client = ClientBuilder::create()->build();

        // 创建 index
        $settings = json_decode('{
            "analysis": {
                "analyzer": {
                    "by_smart": {
                        "type": "custom",
                        "tokenizer": "ik_smart",
                        "filter": [
                            "by_tfr",
                            "by_sfr"
                        ],
                        "char_filter": [
                            "by_cfr"
                        ]
                    },
                    "by_max_word": {
                        "type": "custom",
                        "tokenizer": "ik_max_word",
                        "filter": [
                            "by_tfr",
                            "by_sfr"
                        ],
                        "char_filter": [
                            "by_cfr"
                        ]
                      }
                    },
                    "filter": {
                        "by_tfr": {
                            "type": "stop",
                            "stopwords": [
                                " "
                            ]
                        },
                        "by_sfr": {
                            "type": "synonym",
                            "synonyms_path": "analysis/synonyms.txt"
                        }
                    },
                    "char_filter": {
                        "by_cfr": {
                            "type": "mapping",
                            "mappings": [
                                "| => |"
                            ]
                        }
                    }
                }
            }');

        $mappings = json_decode('{
            "_default_":{
              "properties": {
                  "shoujia": {
                    "type":"double"
                  }
              }
            },
            "xinfang":{
              "_source":{
                "enabled":true
              },
              "properties":{
                  "huxing": {
                      "type": "text",
                      "index": "analyzed",
                      "analyzer": "by_max_word",
                      "search_analyzer": "by_smart"
                  }
              }
            }
        }');

        $params = [
          'index'=>'gj',
          'body'=>[
            'settings'=>$settings,
            'mappings'=>$mappings
          ]
        ];
        $client->indices()->create($params);

8. 名词解释

只用了几天 elasticsearch,懂的地方不多,所以这些只是片面的理解.

_index 类似数据库中的 schema 名字

_type 类似数据表

properties 表中的字段

mappings 配置字段的分词规则(比如我们的ik分词),类型(integer,double,string,text等等)

analysis 分词的规则

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这