Elasticsearch的标准版本及以上是支持设置同义词功能的, 其实也就是除了OSS(开源)版之外其它的都支持.html
$
开头的表明是shell命令, 不然表示Kibana的console命令同义词能够使用synonym
参数来内嵌指定,或者必须 存在于集群每个节点上的同义词文件中。 同义词文件路径由synonyms_path
参数指定,应绝对或相对于 Elasticsearchconfig
目录。
下面以同义词的两种设置方式来介绍:shell
# 进入Elasticsearch目录执行,生成文件 $ echo '"iPhone,苹果手机 => iPhone,苹果手机", "2233,22娘,33娘 => bilibili,B站"' > config/analysis/synonyms.txt
PUT /goods2 { "settings": { "analysis": { "filter": { "my_synonym_filter": { "type": "synonym", "updateable": true, "synonyms_path": "analysis/synonyms.txt" } }, "analyzer": { "my_synonyms_analyzer": { "tokenizer": "ik_smart", "filter": [ "my_synonym_filter" ] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "my_synonyms_analyzer" } } } }
my_synonym_filter
是自定义的词汇过滤器
,my_synonyms_analyzer
是自定义的分析器, 能够看出后者是包含并引用了前者的.在本索引中自定义的词汇过虑器和分析器也只能在当前索引中使用.json
updateable
指示可否动态更新, 必须为true
才能动态更新同义词api
synonyms_path
指示同义词文件的位置app
analysis.analyzer.tokenizer
指示在这个分析器里用ik_smart
的分词器, 在这个索引中的分析链是原始文本 => 分词器 => 词汇过滤器
, 即原始文本先通过分词的结果再用来给词汇过滤器
处理(在这个索引的做用是同义词).iphone
mappings.properties.title.search_analyzer
指示title
字段在查询时使用my_synonyms_analyzer
分析器, 同理mappings.properties.title.analyzer
指示其在索引时使用的分析器.elasticsearch
# 字母大小写没有影响 GET goods2/_analyze { "analyzer": "my_synonyms_analyzer", "text": "iphone" } GET goods2/_analyze { "analyzer": "my_synonyms_analyzer", "text": "苹果手机" }
上面两条语句的结果是同样的ide
{ "tokens" : [ { "token" : "iphone", "start_offset" : 0, "end_offset" : 6, "type" : "ENGLISH", "position" : 0 }, { "token" : "苹果", "start_offset" : 0, "end_offset" : 6, "type" : "SYNONYM", "position" : 0 }, { "token" : "手机", "start_offset" : 0, "end_offset" : 6, "type" : "SYNONYM", "position" : 1 } ] }
GET goods2/_analyze { "analyzer": "my_synonyms_analyzer", "text": "2233" } GET goods2/_analyze { "analyzer": "my_synonyms_analyzer", "text": "22娘" }
结果ui
{ "tokens" : [ { "token" : "bilibili", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 0 }, { "token" : "b", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 0 }, { "token" : "站", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 1 } ] }
# 进入Elasticsearch目录执行,生成文件 # `iPhone,苹果手机 => iPhone,苹果手机`与`iPhone,苹果手机`的效果是同样的 # 内容中的双引号`"`和行末的逗号`,`不是必须的(没有的话需要有换行符), 这里只是为了和和内嵌式的保持一致才这么写的 $ echo '"iPhone,苹果手机", "2233,22娘,33娘 => bilibili,B站,二次元"' > config/analysis/synonyms.txt
# 使新的同义词生效 POST /goods2/_reload_search_analyzers
GET goods2/_analyze { "analyzer": "my_synonyms_analyzer", "text": "2233" }
结果插件
{ "tokens" : [ { "token" : "bilibili", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 0 }, { "token" : "b", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 0 }, { "token" : "二次元", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 0 }, { "token" : "站", "start_offset" : 0, "end_offset" : 4, "type" : "SYNONYM", "position" : 1 } ] }
同义词配置就在synonyms
属性里
PUT /goods3 { "settings": { "analysis": { "filter": { "my_synonym_filter": { "type": "synonym", "synonyms": [ "iPhone,苹果手机 => iPhone,苹果手机", "2233,22娘,33娘 => bilibili,B站" ] } }, "analyzer": { "my_synonyms_analyzer": { "tokenizer": "ik_smart", "filter": [ "my_synonym_filter" ] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "my_synonyms_analyzer" } } } }
下面的结果跟同义词文件方式的是同样的
GET goods3/_analyze { "analyzer": "my_synonyms_analyzer", "text": "iphone" } GET goods3/_analyze { "analyzer": "my_synonyms_analyzer", "text": "2233" }
# 需要先关闭索引才能变动设置 POST /goods3/_close PUT /goods3/_settings/ { "analysis": { "filter": { "my_synonym_filter": { "type": "synonym", "synonyms": [ "iPhone,苹果手机", "2233,22娘,33娘 => bilibili,B站,二次元" ] } } } } # 从新开启索引 POST /goods3/_open
以索引goods2
为例
# 插入一条数据 POST /goods2/_doc/1 { "title":"bilibili是个好平台" } # 经过`2233`关键词查找 GET /goods2/_search { "query": { "match": { "title": "2233" } } }
结果
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.2876821, "hits" : [ { "_index" : "goods2", "_type" : "_doc", "_id" : "1", "_score" : 0.2876821, "_source" : { "title" : "bilibili是个好平台" } } ] } }
内嵌式
和同义词文件式
两种同义词文件式
能够在不关闭索引的状况下动态更新同义词