es搜索同义词近义词技术方案

es搜索同义词近义词技术方案方案一:使用同义词文件,在es索引中定义”synonyms_path”,并设置updateable为true动态更新同义词,但这个需要运维一起配合,当有新增的同义词时候,也需要运维帮我们添加进这个

方案一:

使用同义词文件,在es索引中定义”synonyms_path”,在服务器中放入同义词文件synonyms.txt文件,并设置updateable为true动态读取更新的同义词文件,但这个需要运维一起配合,当有业务有新增同义词时候,也需要运维帮我们添加进这个文件中,维护比较不方便

PUT /myIndex
{ 
   
  "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"
      }
    }
  }
}

查看腾讯云关于同义词配置的文档,关于同义词的添加,也同样需要对现有索引进行reindex操作
在这里插入图片描述

主要讲一下方案二,直接在我们建的索引上进行维护同义词

方案二:同义词技术方案

es建索引时,我们可以给es创建一个同义词语汇单元过滤器,然后使用下面这样的同义词规则:

“衬衫, 衬衫料, 衬衣料, 衬衣”

例子:

1、创建普通索引

先创建一个普通的索引,并增加2条数据,对“海马毛”进行分词,可以得到“海马”,“毛”

在这里插入图片描述

{ 
   
  "索引名" : { 
   
    "aliases" : { 
   
    //索引别名
    },
    "mappings" : { 
   
      "properties" : { 
   
      //索引字段
      }
    },
    "settings" : { 
   
        "number_of_shards" : "3",
        "max_result_window" : "100000000",
        "analysis" : { 
   
          "filter" : { 
   
            "my_synonym" : { 
   
              "ignore_case" : "true",
              "expand" : "true",
              "type" : "synonym",
              "synonyms" : [
                "马海毛,海马毛"
              ],
              "tokenizer" : "standard"
            }
          },
          "analyzer" : { 
   
            "ik_max_word_my_analyzer" : { 
   
              "filter" : [
                "my_synonym"
              ],
              "tokenizer" : "ik_max_word_tokenizer"
            }
          },
          "tokenizer" : { 
   
            "ik_max_word_tokenizer" : { 
   
              "type" : "ik_max_word"
            }
          }
        }
      }
    }
  }

进行match检索,发现也只能召回出一条数据

在这里插入图片描述

但是,业务上如果要认为在搜索上,输入海马毛的检索效果跟马海毛的一样,那么就需要给es配置同义词

2、创建含有同义词过滤器的es索引

es配置同义词的格式有多种,最简单的就是使用逗号分割

"jump,leap,hop"(推荐)

或者, 使用 => 语法,可以指定一个词项列表(在左边),和一个或多个替换(右边)的列表:

"u s a,united states,united states of america => usa"
或者,扩展
"kitten => kitten,cat,pet"

关于自定义分析器,可参考官方文档https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-analyzers.html
在这里插入图片描述

自定义分析器后,我们增加再对“海马毛”进行分词
在这里插入图片描述

发现同义词已经生效了,这个时候,我们在检索“海马毛”时候,也可以召回到“马海毛”的数据
在这里插入图片描述
后期维护:

后续业务如果还需要一直添加同义词,对es来说,是需要reindex进行操作

reindix操作的操作在我另一篇博客有详细描述:传送门

如果只是单纯修改settings,那么只会对改索引新增的文档数据有效,对旧数据无效

今天的文章es搜索同义词近义词技术方案分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69440.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注