【ES】Elasticsearch:词干、Shingles 和同义词过滤器

这篇具有很好参考价值的文章主要介绍了【ES】Elasticsearch:词干、Shingles 和同义词过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


分词器生成的分词可能需要进一步丰富或增强,例如小写(或大写)标记、提供同义词、开发词干词、删除撇号或标点符号等。 分词过滤器对分词进行处理以执行此类转换。

Elasticsearch 提供了将近 50 个分词过滤器,正如你可以想象的那样,在这里讨论所有这些过滤器是不可行的。 我已经设法抓住了一些,但请随时参考官方文档以了解其余的分词过滤器。 我们可以通过简单地附加到分词器并在 _analyze API 调用中使用它来测分词过滤器,如以下清单所示:

GET _analyze
{
    "tokenizer" : "standard",
    "filter" : ["uppercase","reverse"],
   "text" : "Elastic Stack"
  }

上面的命令输出的结果为:

{
    "tokens": [
      {
        "token": "CITSALE",
        "start_offset": 0,
        "end_offset": 7,
        "type": "<ALPHANUM>",
       "position": 0
      },
      {
        "token": "KCATS",
        "start_offset": 8,
        "end_offset": 13,
       "type": "<ALPHANUM>",
        "position": 1
     }
    ]
  }

过滤器接受一个分词过滤器数组; 例如,我们在此示例中提供了 uppercase 和 reverse 过滤器)。 输出将是 “CITSALE” 及 “KCATS”(每个词进行了大写及反转)。
你还可以将过滤器附加到自定义分析器,如以下清单所示。 然后因为我们知道如何附加分词过滤器,所以我们将看几个例子。

  PUT index_with_filters
  {
    "settings": {
      "analysis": {
        "analyzer": {
          "token_filter_analyzer": {
            "tokenizer": "standard",
           "filter": [ "uppercase","reverse"]
        }
        }
      }
    }
  }

我们可以一如下的方式来测试上面的定制分析器:

 POST index_with_filters/_analyze
  {
    "text": "Elastic Stack",
    "analyzer": "token_filter_analyzer"
  }

词干过滤器(stemmer filter)

词干提取是一种将单词缩减为词根的机制(例如,单词 “bark” 是 “barking” 的词根)。Elasticsearch 提供了一个开箱即用的词干提取器,可以将单词缩减为词根形式。 以下清单演示了词干分析器的用法示例。

1.  POST _analyze
2.  {
3.    "tokenizer": "standard",
4.    "filter": ["stemmer"],
5.    "text": "I like watching TV"
6.  }

复制代码
上面命令输出的结果为:

1.  {
2.    "tokens": [
3.      {
4.        "token": "I",
5.        "start_offset": 0,
6.        "end_offset": 1,
7.        "type": "<ALPHANUM>",
8.        "position": 0
9.      },
10.      {
11.        "token": "like",
12.        "start_offset": 2,
13.        "end_offset": 6,
14.        "type": "<ALPHANUM>",
15.        "position": 1
16.      },
17.      {
18.        "token": "watch",
19.        "start_offset": 7,
20.        "end_offset": 15,
21.        "type": "<ALPHANUM>",
22.        "position": 2
23.      },
24.      {
25.        "token": "TV",
26.        "start_offset": 16,
27.        "end_offset": 18,
28.        "type": "<ALPHANUM>",
29.        "position": 3
30.      }
31.    ]
32.  }

从上面的输出中,我们可以看出来 watching 的分词变为 watch,也就是说 watch 是 watching 的词干。

Shingle filter

Shingles 是在分词级别生成的单词 n-gram(不同于在字母级别发出 n-gram 的 n-gram 和 edge_ngram)。 例如,文本 “james bond” 发出 “james” 和 “james bond”。 以下代码显示了 shingle 过滤器的示例用法:

1.  POST _analyze
2.  {
3.    "tokenizer": "standard",
4.    "filter": ["shingle"],
5.    "text": "java python go"
6.  }

上面的输出为:

1.  {
2.    "tokens": [
3.      {
4.        "token": "java",
5.        "start_offset": 0,
6.        "end_offset": 4,
7.        "type": "<ALPHANUM>",
8.        "position": 0
9.      },
10.      {
11.        "token": "java python",
12.        "start_offset": 0,
13.        "end_offset": 11,
14.        "type": "shingle",
15.        "position": 0,
16.        "positionLength": 2
17.      },
18.      {
19.        "token": "python",
20.        "start_offset": 5,
21.        "end_offset": 11,
22.        "type": "<ALPHANUM>",
23.        "position": 1
24.      },
25.      {
26.        "token": "python go",
27.        "start_offset": 5,
28.        "end_offset": 14,
29.        "type": "shingle",
30.        "position": 1,
31.        "positionLength": 2
32.      },
33.      {
34.        "token": "go",
35.        "start_offset": 12,
36.        "end_offset": 14,
37.        "type": "<ALPHANUM>",
38.        "position": 2
39.      }
40.    ]
41.  }

过滤器的默认行为是发出 uni-grams 和双词 n-grams。 我们可以通过创建带有自定义 shingle 过滤器的自定义分析器来更改此默认行为。 下面的清单显示了这是如何配置的。

1.  PUT index_with_shingle
2.  {
3.    "settings": {
4.      "analysis": {
5.        "analyzer": {
6.          "shingles_analyzer":{
7.            "tokenizer":"standard",
8.            "filter":["shingles_filter"]
9.          }
10.        },
11.        "filter": {
12.          "shingles_filter":{
13.            "type":"shingle",
14.            "min_shingle_size":2,
15.            "max_shingle_size":3,
16.            "output_unigrams":false
17.          }
18.        }
19.      }
20.    }
21.  }

在某些文本上调用此代码(如下面的清单所示)会生成两组和三组单词。

1.  POST index_with_shingle/_analyze
2.  {
3.    "text": "java python go",
4.    "analyzer": "shingles_analyzer"
5.  }

上面命令输出的结果为:

1.  {
2.    "tokens": [
3.      {
4.        "token": "java python",
5.        "start_offset": 0,
6.        "end_offset": 11,
7.        "type": "shingle",
8.        "position": 0
9.      },
10.      {
11.        "token": "java python go",
12.        "start_offset": 0,
13.        "end_offset": 14,
14.        "type": "shingle",
15.        "position": 0,
16.        "positionLength": 2
17.      },
18.      {
19.        "token": "python go",
20.        "start_offset": 5,
21.        "end_offset": 14,
22.        "type": "shingle",
23.        "position": 1
24.      }
25.    ]
26.  }

分析器返回 [java python, java python go, python go] 因为我们已经将过滤器配置为仅生成 2 个和 3 个单词的 shingles。 输出中删除了像 “java”、“python”等一元组(一个单词 shingle),因为我们禁用了过滤器来输出它们。
更多关于 Singles 过滤器的内容,请参考文章 “Elasticsearch: Ngrams, edge ngrams, and shingles”。

同义词过滤器

同义词是具有相同含义的不同词。 例如,对于 football 和 soccer(后者是美国对 football 的称呼),两者都应该指向足球比赛。 同义词过滤器有助于创建一组词,以帮助在搜索时产生更丰富的用户体验。
Elasticsearch 希望我们通过使用同义词分词过滤器配置分析器来提供一组单词及其同义词。 如清单所示,我们在索引的设置上创建同义词过滤器:

1.  PUT index_with_synonyms
2.  {
3.    "settings": {
4.      "analysis": {
5.        "filter": {
6.          "synonyms_filter":{
7.            "type":"synonym",
8.            "synonyms":[ "soccer => football"]
9.          }
10.        }
11.      }
12.    }
13.  }

在代码示例中,我们创建了一个与同义词类型关联的同义词列表(soccer 被视为 football 的替代名称)。 一旦我们用这个过滤器配置了索引,我们就可以测试文本字段:

1.  POST index_with_synonyms/_analyze
2.  {
3.    "text": "What's soccer?",
4.    "tokenizer": "standard", 
5.    "filter": ["synonyms_filter"]
6.  }

上面命令输出的结果为:

1.  {
2.    "tokens": [
3.      {
4.        "token": "What's",
5.        "start_offset": 0,
6.        "end_offset": 6,
7.        "type": "<ALPHANUM>",
8.        "position": 0
9.      },
10.      {
11.        "token": "football",
12.        "start_offset": 7,
13.        "end_offset": 13,
14.        "type": "SYNONYM",
15.        "position": 1
16.      }
17.    ]
18.  }

这会产生两个分词:“What’s” 和 “football”。 从输出中可以看出,“soccer” 这个词被 “football” 这个词替换了。

从文件中配置同义词

我们可以通过文件系统上的文件提供同义词,而不是像我们在前面的清单中那样对它们进行硬编码。 为此,我们需要在 synonyms_path 变量中提供文件路径,如以下清单所示。

1.  PUT index_with_synonyms_from_file_analyzer
2.  {
3.    "settings": {
4.      "analysis": {
5.        "analyzer": {
6.          "synonyms_analyzer":{
7.            "type":"standard",
8.            "filter":["synonyms_from_file_filter"]
9.          }
10.        }
11.        ,"filter": {
12.          "synonyms_from_file_filter":{
13.            "type":"synonym",
14.            "synonyms_path":"synonyms.txt" #A Relative path of the synonyms file
15.          }
16.        }
17.      }
18.    }
19.  }

确保在 $ELASTICSEARCH_HOME/config 下创建了一个名为 “synonyms.txt” 的文件,其内容如下:
带有一组同义词的 synonyms.txt 文件

1.  # file: synonyms.txt
2.  important=>imperative
3.  beautiful=>gorgeous

我们可以使用相对或绝对路径调用该文件。 相对路径指向 Elasticsearch 安装文件夹的 config 目录。 我们可以通过使用以下输入调用 _analyze API 来测试上述分析器,如清单中所示:

1.  POST index_with_synonyms_from_file_analyzer/_analyze
2.  {
3.    "text": "important",
4.    "tokenizer": "standard", 
5.    "filter": ["synonyms_from_file_filter"]
6.  }

我们当然应该得到 “imperative” 分词作为响应,证明同义词是从我们放在配置文件夹中的 synonyms.txt 文件中提取的。 你可以在 Elasticsearch 运行时向该文件添加更多值并尝试一下。文章来源地址https://www.toymoban.com/news/detail-453178.html

到了这里,关于【ES】Elasticsearch:词干、Shingles 和同义词过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch 同义词管理热更新

    项目有需要做一个同义词搜索的功能,就去研究了下es的同义词搜索功能,踩了不少坑记录下 如果只是需要同义词搜索,不需要管理和更新,es本体就能支持,我踩的坑基本也不在这,就不具体说了,参考这个就好了https://blog.csdn.net/qq_40592041/article/details/108006994 插件仓库地址

    2024年02月19日
    浏览(26)
  • Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能

    同义词用于提高搜索质量并扩大匹配范围。 例如,搜索 England 的用户可能希望找到包含 British 或 UK 的文档,尽管这三个词完全不同。 Elasticsearch 中的同义词功能非常强大,如果实施得当,可以使你的搜索引擎更加健壮和强大。 在本文中,我们将通过简单的代码片段介绍在实

    2024年02月13日
    浏览(29)
  • Elasticsearch同义词自定义词库未生效原因

    检查文件及目录是否存在 所有节点配置完之后都要重启 检查测试脚本是否正确的,我遇到的问题就是脚本不正确但是确能执行,就是拿不到正确结果 错误脚本: 正确脚本:

    2024年02月11日
    浏览(26)
  • docker-compose安装es以及ik分词同义词插件

    目录 1 前言 2 集成利器Docker 2.1 Docker环境安装 2.1.1 环境检查 2.1.2 在线安装 2.1.3 离线安装 2.2 Docker-Compose的安装 2.2.1 概念简介 2.2.2 安装步骤 2.2.2.1 二进制文件安装 2.2.2.2 离线安装 2.2.2.3 yum安装 3 一键安装ES及Kibana 3.1 yml文件的编写 3.1.1 elasticsearch.yml配置 3.1.2 kibana.yml配置 3.2 一键

    2024年04月23日
    浏览(32)
  • 使用阿里云试用Elasticsearch学习:3.6 处理人类语言——同义词

    词干提取是通过简化他们的词根形式来扩大搜索的范围,同义词 通过相关的观念和概念来扩大搜索范围。 也许没有文档匹配查询 “英国女王“ ,但是包含 “英国君主” 的文档可能会被认为是很好的匹配。 用户搜索 “美国” 并且期望找到包含 美利坚合众国 、 美国 、 美

    2024年04月10日
    浏览(32)
  • Elasticsearch教程(35) ik中文分词器+pinyin拼音分词器+同义词

    闲来无事,发现上一篇ES博客还是 去年9月份 写的中文ik分词器 pinyin 首字母 search_as_you_type 组合使用,该篇文章还挖了一个 大坑 没有填,快一年了,是时候填下坑了。 针对股票查询这个特点场景,再结合一般使用者的搜索习惯,暂时确定如下7种期望效果。 上一篇博客Elast

    2023年04月09日
    浏览(33)
  • 同义词替换-批量自动同义词替换软件

    同义词替换,今天给大家分享一款免费的同义词替换器,支持各种同义词替换。一个同义词可以替换多种同义词。同时还支持同义词文章替换详细参考图片 如何优化网站是每个专业SEO人员都熟悉的问题,也是每天必须做的功课之一。接下来,我们来谈谈网站中的高索引

    2024年02月09日
    浏览(27)
  • Oracle系列十二:视图、记录、同义词、序列

    (1)基本概念 Oracle视图是数据库中的一种特殊对象,它是一个虚拟的表,不存储数据,而是基于一个或多个表的查询结果而创建的。视图可以看作是一个 存储在数据库中的查询结果集 ,具有表的特性,包含一系列带有名称的列和行数据, 可以被查询、修改和删除 等。 视图

    2024年02月03日
    浏览(26)
  • Oracle存过-对象权限创建回收、同义词创建删除

    Oracle存过-对象权限创建回收、同义词创建删除

    2024年02月15日
    浏览(29)
  • ​ES elasticsearch-analysis-dynamic-synonym​连接数据库动态更新synonym近义词

            在很多搜索场景中,我们希望能够搜索出搜索词相关的目标,同时也希望能搜索出其近义词相关的目标。例如在商品搜索中,搜索“ 瓠瓜 ”,也希望能够搜索出“ 西葫芦 ”,但“ 西葫芦 ”商品名称因不含有“ 瓠瓜 ”,导致无法搜索出来。         此时就

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包