如何使用elasticsearch正确处理多词同义词扩展?

2024-03-30

我有以下同义词扩展:

suco => suco, refresco, bebida de soja

我想要的是以这种方式标记搜索:

搜索“suco de laranja”将被标记为 [“suco”、“laranja”、“refresco”、“bebida de soja”]。

但我将其标记为 [“suco”、“laranja”、“refresco”、“bebida”、“soja”]。

考虑到“de“单词是一个停用词。我希望在查询中忽略它,例如“bebida de laranja”变成[“bebida”,“laranja”]。但我不希望在同义词标记化中考虑它,所以“ bebida de soja”仍然作为一个标记“bebida de soja”。

我的设置 :

{
    "settings":{
        "analysis":{
            "filter":{
                "synonym_br":{
                    "type":"synonym",
                    "synonyms":[
                        "suco => suco, refresco, bebida de soja"
                    ]
                },
                "brazilian_stop":{
                    "type":"stop",
                    "stopwords":"_brazilian_"
                }
            },
            "analyzer":{
                "synonyms":{
                    "filter":[
                        "synonym_br",
                        "lowercase",
                        "brazilian_stop",
                        "asciifolding"
                    ],
                    "type":"custom",
                    "tokenizer":"standard"
                }
            }
        }
    }
}

我建议您进行以下两项更改。第一个与您提出的问题直接相关,第二个是建议。

  1. 不要使用多个同义词的扩展,而是执行相反的操作,即所有同义词都指向单个单词同义词。所以,改变"suco => suco, refresco, bebida de soja" to "suco, refresco, bebida de soja => suco"

  2. 更改过滤器的顺序synonyms分析仪。地方lowercase before synonym_br。这将确保案件不会影响synonym_br令牌过滤器。

所以最终设置将是:

{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_br": {
          "type": "synonym",
          "synonyms": [
            "suco, refresco, bebida de soja => suco"
          ]
        },
        "brazilian_stop": {
          "type": "stop",
          "stopwords": "_brazilian_"
        }
      },
      "analyzer": {
        "synonyms": {
          "filter": [
            "lowercase",
            "synonym_br",
            "brazilian_stop",
            "asciifolding"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

这是如何运作的?

用于输入bebida de soja过滤器按以下顺序应用:

Input Filter        Result tokens
====================================
lowercase           bebida, de, soja
synonym_br          suco             <------- all the above tokens(including position) exactly matches a synonym
brazilian_stop      suco
asciifolding        suco

让我们来看看brazilian_stop在行动中。为此,我们需要一个与同义词不匹配但具有的输入de在里面。例如。de soja:

Input Filter        Result tokens
=================================
lowercase           de, soja
synonym_br          de, soja  <------- none of the tokens (independently or combined(including position)) matches any synonym
brazilian_stop      soja      <------- de is removed as it is a stopword
asciifolding        soja
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用elasticsearch正确处理多词同义词扩展? 的相关文章

随机推荐

  • Rails 关联方法如何工作?

    Rails 关联方法如何工作 让我们考虑这个例子 class User lt ActiveRecord Base has many articles end class Article lt ActiveRecord Base belong
  • 将 SVG 作为 Gatsby 中的组件导入

    我见过以下解决方案 import ReactComponent as Img from path to file svg 但在盖茨比看来 这行不通 我知道存在这方面的插件 但也许可以更容易地完成 正如您所说 有一些插件可以实现此目的 这意味
  • 为什么 C++ 标准没有提到 __STDC_IEC_559__?

    根据 C 11 标准 c math
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一
  • spring 在运行时添加数据源

    我正在开发一个带有每个租户数据库策略的 Spring Boot 多租户应用程序 要求是在运行时添加新数据库 这意味着我必须动态创建新的数据源对象 我还研究了 Spring 的 AbstractRoutingDataSource 但需要预定义
  • Java和继承的静态成员[重复]

    这个问题在这里已经有答案了 假设我有以下课程 class Parent private int ID private static int curID 0 Parent ID curID curID 以及这两个子类 class Sub1 e
  • 有类似于 Perforce 的 git-svn 的东西吗?

    有没有一个工具可以让我获得与 Perforce 的 git svn 相同的功能 我在 github 上看到了 git p4 但看起来像是将源代码从 git 存储库导入到 Perforce 存储库 情况是否会反过来呢 它是用作常用工具还是仅用
  • Xcode 7 Git 找不到远程存储库

    我可以在 Xcode 6 X 上毫无问题地推送和拉取此存储库 但它在 Xcode 7 上不起作用 设置与 Xcode 6 X 相同 我尝试输入用户名和密码只是为了确认 但似乎没有任何意义 我使用了正确的 SSH 密钥作为身份验证 但首选项显
  • 如何通过指针处理矩阵中的子矩阵?

    我有一个大小为 n 的矩阵 举个例子 我的递归函数对位于矩阵边界的元素进行处理 现在我想在内方矩阵上调用它 递归调用 这是我的递归函数的原型 void rotate int mat size t n 我知道二维数组是数组中的数组 我知道 m
  • Springfox 类参数已弃用

    在Springfox 3 0中 springfox documentation service Parameter已弃用 是否有提供参数及其构建器的更新方法 以及如何提供其default value 首先 使用RequestParamete
  • 使用 function.php 的单一产品的 Woocommerce 元数据

    我正在努力通过我的functions php 正确过滤元数据 I can get this to work if I edit the meta php in my child theme with no problem short sto
  • 将数据从VSS迁移到SVN

    如何将我的数据从 VSS 迁移到 SubVersion 这取决于您是否想随身携带 VSS 元数据 如果是 请看一下电源管理员 http www poweradmin com sourcecode vssmigrate aspx or Vss
  • 版本号大于 1.18.10 的正则表达式 [重复]

    这个问题在这里已经有答案了 我需要验证应用程序的版本号是否大于 1 18 10 在这种情况下 正则表达式应该是什么样子 不要为此使用正则表达式 使用split and tuple比较 def is recent version versio
  • 将点击事件与 Twitter Bootstrap 结合使用

    我正在使用 twitter bootstrap 开发一个可以在多个设备上呈现的 Web 应用程序 现在我想处理 点击 事件 所以我的问题是 我可以使用 jquery 1 7 2 处理 tap 事件而不使用 jquery Mobile 吗 如
  • minikube docker-env 是什么意思?

    在 Kubernetes 中minikube 教程 https kubernetes io docs tutorials hello minikube create your node js application有这个命令可以使用 Min
  • 如何在批处理脚本中找到应用程序的完整路径

    如何在批处理脚本中找到应用程序 XYZ 如果已安装 的完整路径 澄清 应用程序不在 PATH 中 我所拥有的就是它的名称 在本例中为 ISTool exe 我想得到C 程序 ISTool ISTool exe 您可以在路径 或其他类似路径的
  • 在类本身内部创建类实例是如何工作的?

    是什么使得在类本身内部创建类的实例成为可能 public class My Class My Class new class new My Class 我知道这是可能的 并且自己也做到了 但我仍然无法让自己相信这不是 谁先有鸡还是先有蛋 之
  • 中使用自定义模板名称

    目前我有这段代码 它为每个用户节点调用 用户 模板
  • 如何在没有 Root 设备的情况下使用自己的 Android 服务进行屏幕截图?

    我进行了很多搜索并找到了两个库 1 https code google com p android screenshot library https code google com p android screenshot library
  • 如何使用elasticsearch正确处理多词同义词扩展?

    我有以下同义词扩展 suco gt suco refresco bebida de soja 我想要的是以这种方式标记搜索 搜索 suco de laranja 将被标记为 suco laranja refresco bebida de s