ElasticSearch 中文同义词实现

参考以下两个网址,但运行报错,以下是我自己改进方式和使用总结。
https://github.com/medcl/elasticsearch-analysis-ik/issues/93
http://elasticsearch.cn/?/question/29
本文前提默认已经装好ES和IK插件。

1:elasticserach.yml 最后一行添加如下内容(该文件位于elasticsearch-x.x.x/config目录下):
index.analysis.analyzer.default.type: ik

2:在elasticsearch-x.x.x/config目录下新建同义词文件synonyms.txt。
其中,synonyms.txt 编码格式为’utf-8’,内容建议为空。

3:创建索引

curl -XPUT localhost:9200/test -d'
{
    "settings": {
    "index": {
      "analysis": {
        "analyzer": { "jt_cn": { "type": "custom", "use_smart": "true", "tokenizer": "ik_smart", "filter": ["jt_tfr","jt_sfr"], "char_filter": ["jt_cfr"] }, "ik_smart": { "type": "ik", "use_smart": "true" }, "ik_max_word": { "type": "ik", "use_smart": "false" } },
        "filter": { "jt_tfr": { "type": "stop", "stopwords": [" "] }, "jt_sfr": { "type": "synonym", "synonyms_path": "synonyms.txt" } },
        "char_filter": { "jt_cfr": { "type": "mapping", "mappings": [ "| => \\|" ] } }
      }
    }
  }
}'

4:创建映射

curl -X PUT localhost:9200/test/haizhi/_mapping -d '{
    "haizhi": {
      "properties": {
        "title": {
          "include_in_all": true,
          "analyzer": "jt_cn",
          "term_vector": "with_positions_offsets",
          "boost": 8,
          "store": true,
          "type": "string"
        }
      }
    }
 }'

5:插入数据

curl -XPUT localhost:9200/test/haizhi/1 -d '{
    "title": "番茄"
}'
curl -XPUT localhost:9200/test/haizhi/2 -d '{
    "title": "西红柿"
}'
curl -XPUT localhost:9200/test/haizhi/3 -d '{
    "title": "我是西红柿"
}'
curl -XPUT localhost:9200/test/haizhi/4 -d '{
    "title": "我是番茄"
}'
curl -XPUT localhost:9200/test/haizhi/5 -d '{
    "title": "土豆"
}'
curl -XPUT localhost:9200/test/haizhi/6 -d '{
    "title": "aa"
}'

6:查询1

curl -XPOST 'localhost:9200/test/haizhi/_search?pretty' -d '
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "西红柿",
        "analyzer": "jt_cn"
      }
    }
  },
"highlight": {
    "pre_tags": [
      "<tag1>",
      "<tag2>"
    ],
    "post_tags": [
      "</tag1>",
      "</tag2>"
    ],
    "fields": {
      "title": {}
    }
  }
}'
  • 结果如下
    这里写图片描述

7:查询2
我们知道“西红柿”和“番茄”是同义词,我们在同义词词典(synonyms.txt)中添加如下内容,并重启ES,再用第6步的查询。

#Example:
西红柿, 番茄
  • 结果如下,成功匹配同义词
    这里写图片描述

8:查询3
修改同义词词典(synonyms.txt)为如下内容,重启ES。

#Example:
西红柿, 番茄
超级土豆, 土豆

查询如下:

curl -XPOST 'localhost:9200/test/haizhi/_search?pretty' -d '
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "超级土豆",
        "analyzer": "jt_cn"
      }
    }
  }
}'
  • 结果如下,查不到结果
    这里写图片描述

9:查询4
在{plugins}/elasticsearch-analysis-ik-*/config/custom/mydict.dic词典中新加“超级土豆”一词,并且重启ES。
- 结果如下,成功用“超级土豆”搜索到“土豆”一词
这里写图片描述

10:小结

  • 同义词字典或是IK用户自定义词典更新,必须每次重启elasticsearch才有效。
  • 同义词词对是必须能被完成切分的词语。
    比如在synonyms.txt 文件中增加同义词对: ‘超级土豆’ – ‘土豆’ 。但在实际的搜索中用“超级土豆”是搜不到“土豆”的。因为“超级土豆”会被切分为多个词语。必须在{plugins}/elasticsearch-analysis-ik-*/config/custom/mydict.dic词典中新加“超级土豆”一词,才能用“超级土豆”一词搜出“土豆”。
### 回答1: 要实现同义词检索,可以使用 Elasticsearch同义词过滤器。具体步骤如下: 1. 在 Elasticsearch 中创建一个索引,并且定义一个分析器,该分析器包含一个同义词过滤器。 2. 在同义词过滤器中定义同义词词库。同义词词库可以是一个文本文件或者一个 Elasticsearch 索引。 3. 在查询时,使用该分析器进行分析,Elasticsearch 将自动将查询中的同义词转换成对应的主词。 4. 如果需要查询某个同义词的文档,可以使用 Elasticsearch 的多字段查询功能,将同义词字段和主词字段一起查询。 下面是一个示例的 Elasticsearch 配置文件,用于实现同义词检索: ``` PUT /my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "my_synonyms" ] } }, "filter": { "my_synonyms": { "type": "synonym", "synonyms_path": "analysis/synonyms.txt" } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "my_analyzer" }, "content": { "type": "text", "analyzer": "my_analyzer" } } } } ``` 在上面的配置文件中,定义了一个名为 `my_synonyms` 的同义词过滤器,该过滤器使用了 `analysis/synonyms.txt` 文件中的同义词。在 `mappings` 中,定义了两个字段 `title` 和 `content`,它们的分析器都是 `my_analyzer`。 接下来,可以使用以下查询语句进行同义词检索: ``` GET /my_index/_search { "query": { "multi_match": { "query": "foo", "fields": ["title", "content"] } } } ``` 在上面的查询中,Elasticsearch 将会自动将 `foo` 转换成对应的同义词,然后在 `title` 和 `content` 字段中进行查询。 ### 回答2: es(Elasticsearch)是一个开源的分布式搜索与分析引擎,它提供了强大的全文搜索和分析功能。要实现同义词检索,可以借助于es的分析器和同义词过滤器的功能。 在es中,我们可以使用自定义的分析器来对文本进行预处理。首先,我们需要创建一个自定义的分析器,并在其中使用同义词过滤器。同义词过滤器通过将特定词汇映射到一组同义词,从而使es能够将包含这些词汇的文本与包含其同义词的文本进行匹配。 为了实现同义词检索,首先需要定义一个同义词词典。这个词典包含一组词汇及其同义词的映射关系。然后,我们在创建分析器的过程中,将同义词过滤器应用到需要进行同义词检索的字段上。 例如,假设我们有一个包含商品描述的索引,我们想要实现对商品名称的同义词检索。首先,我们将创建一个同义词词典,比如将"手机"和"电话"作为同义词。然后,我们创建一个分析器,其中包含一个同义词过滤器,将"手机"映射到"电话"。接下来,我们将该分析器应用到商品名称字段上。 当用户进行搜索时,输入"手机"时,es会将其转换为"电话",从而可以匹配包含"电话"这个词的商品名称。这样,即使用户输入的不是严格匹配的词汇,也可以得到包含其同义词的相关结果。 总之,使用自定义的分析器和同义词过滤器,我们可以在es中实现同义词检索。通过将词汇映射到一组同义词,es可以将包含这些词汇或其同义词的文本进行匹配,从而提供更准确的搜索结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值