Elasticsearch 6.2 中的精确匹配、不区分大小写的匹配,无需标准化

2024-02-15

我查看了我能找到的关于执行完全匹配、不区分大小写的查询的每一篇文章和帖子,但在实现后,它们并没有执行我正在寻找的内容。

在将此问题标记为重复之前,请阅读整篇文章。

给定一个用户名,我想查询我的 Elasticsearch 数据库以仅返回与用户名完全匹配的文档,但也不区分大小写。

我尝试指定一个lowercase分析仪为我的username财产和使用match查询来实现此行为。虽然这解决了不区分大小写的匹配问题,但它无法精确匹配。

我研究过使用lowercase标准化器,但这会使我的所有用户名在索引之前变为小写,因此当我聚合用户名时,它们将以小写形式返回,这不是我想要的。我需要保留用户名中每个字母的原始大小写。

我想要的是以下行为:


插入用户

POST {elastic}/users/_doc
{
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "username": "UsErNaMe",
    "password": "1234567"
}

该文档将存储在名为的索引中users就是这样。

通过用户名获取用户

GET {frontend}/user/UsErNaMe

应该返回

{
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "username": "UsErNaMe",
    "password": "1234567"
}

and

GET {frontend}/user/username

应该返回

{
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "username": "UsErNaMe",
    "password": "1234567"
}

and

GET {frontend}/user/USERNAME

应该返回

{
    "email": "[email protected] /cdn-cgi/l/email-protection",
    "username": "UsErNaMe",
    "password": "1234567"
}

and

GET {frontend}/user/UsErNaMe $RaNdoM LeTteRs

should NOT返回任何东西。

谢谢。


为了实现不区分大小写的精确匹配,您需要定义自己的分析器。分析器需要执行两个操作:

  1. 小写输入值。 (不区分大小写)
  2. 小写操作后对输入进行任何修改都不会。 (用于精确搜索)

上述两项可以通过以下方式实现:

  1. use lowercase定义自定义分析器时进行过滤。
  2. set the tokenizer to keyword,这将确保在应用小写过滤器后生成输入值的单个标记。

现在,此自定义分析器可以应用于需要不区分大小写的精确搜索的文本字段。

因此,要创建索引,您可以使用以下命令:

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "case_insensitive_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "keyword"
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "email": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "username": {
          "type": "text",
          "analyzer": "case_insensitive_analyzer"
        },
        "password": {
          "type": "keyword"
        }
      }
    }
  }
}

在上面的case_insensitive_analyzer是所需的分析器,正如您所看到的,它应用于username field.

因此,当您按如下方式索引文档时:

PUT test/_doc/1
{
  "email": "[email protected] /cdn-cgi/l/email-protection",
  "username": "UsErNaMe",
  "password": "1234567"
}

对于现场username输入是UsErNaMe。分析器首先应用lowercase对输入进行过滤UsErNaMe得出的值username。现在就这个值username它适用keywordtokenizer 不执行任何操作,只是将应用过滤器后获得的值输出为单个标记,即username.

现在您可以使用如下匹配查询来搜索用户名字段:

GET test/_doc/_search
{
  "query": {
    "match": {
      "username": "USERNAME"
    }
  }
}

使用上面的内容会给你想要的输出。代替USERNAME在上面的查询中username or UsErNaMe or USERname全部都将与文档匹配。这样做的原因是,如果没有明确指定分析器,则在搜索时,elasticsearch 将使用索引时应用于字段的分析器。在上述情况下,当搜索字段时username, case_insensitive_analyzer将应用于输入值,即USERNAME这将导致令牌username因此才有了这场比赛。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 6.2 中的精确匹配、不区分大小写的匹配,无需标准化 的相关文章

  • 在elasticsearch中存储聊天消息的最佳方式

    我们目前正在实施一项即时通讯系统在我们的平台上 我们需要为我们的用户提供聊天记录并能够显示用户最近进行的 5 次对话 像 Facebook 上的预览一样 事实上 我们必须考虑如何才能存储所有这些数据 我们正在使用弹性搜索我们认为这可能是存储
  • field 和 field.keyword 之间的区别

    如果我将一个包含多个字段的文档添加到 Elasticsearch 索引中 当我在 Kibana 中查看它时 我每次都会得到相同的字段两次 其中之一将被称为 some field 另一个将被称为 some field keyword 这种行为
  • Elasticsearch:将新元素附加到对象的嵌套数组

    我正在尝试将新项目添加到特定文档中的嵌套对象数组中 我已经搜索过 似乎部分文档的更新不支持我需要的内容 它用新元素替换了整个数组 所以我进行了脚本化更新 它通过 REST API 按预期工作 PUT transactions mapping
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外
  • 字段中的点不用于分解分析器的单词

    我有以下索引文档映射 简化 documents mappings document properties filename type string fields lower case sort type string
  • 我们如何查询Kibana?

    我们如何使用 REST API 请求 Kibana 来获取可视化请求 和回应 Like this 我想使用 NodeJS 来操作 Kibana 的结果 目的是我想以编程方式 通过 REST API 直接查询 Kibana 以获取 ES 请求
  • 弹性搜索不提供页面大小较大的数据

    获取数据大小 约20 000 问题 在 python 中使用以下命令搜索 Elasticsearch 索引数据 但没有得到任何结果 from pyelasticsearch import ElasticSearch es repo Elas
  • Elasticsearch 中的组合非嵌套和嵌套查询

    我想使用 ES 进行书籍搜索 所以我决定将作者姓名和标题 作为嵌套文档 放入索引中 如下所示 curl XPUT localhost 9200 library search books 1 d author one books title
  • JavaScript 正则表达式中的部分字符串不区分大小写 (?i) 选项不起作用

    我正在使用 Nodejs 构建应用程序 在该应用程序中我需要处理某些字符串 为此我使用了 JS RegExp 对象 我希望正则表达式中的字符串的一部分不区分大小写 var key i c i ustomParam var find b ke
  • Elasticsearch 将字符串与模糊字段相匹配

    我正在尝试将字符串与字段匹配 并且只想应用模糊性 例如 对于这些文档 title replace oilfilter title replace motoroil 以下查询应仅匹配第一个文档 Replace oilfilter Replac
  • 在 Elasticsearch 中将字符串的默认映射更改为“未分析”

    在我的系统中 数据的插入始终是通过 Logstash 通过 csv 文件完成的 我从不预先定义映射 但每当我输入一个字符串时 它总是被认为是analyzed 结果像这样的条目hello I am Sinha被分成hello I am Sin
  • ElasticSearch - 字符串字段长度的统计方面

    我想检索有关字符串字段的数据 例如最小 最大和平均长度 通过计算字符串内的字符数 我的问题是聚合 http www elasticsearch org guide en elasticsearch reference current sea
  • 如何查找elasticsearch 6.2.1中存在的索引?

    我试图检查elasticsearch 6 2 1的RestHighLevelClient中是否存在索引 目前我正在使用以下代码 try OpenIndexRequest openIndexRequest new OpenIndexReque
  • 方案符号中区分大小写

    据我所知 Scheme 中的符号不 区分大小写 即 eq Hello hello 评估为 t 因为两者都用符号表示 hello 并且scheme具有两个同名符号是同一个对象的属性 然而 这对我来说似乎并非如此 而且事情似乎区分大小写 无论我
  • 如何将不带空格的单词与带空格的 ElasticSearch 数据进行匹配

    在我的elasticsearch中 我有数据 New York 我想查询并匹配 NewYork 请注意查询字符串中没有空格 我怎样才能实现这个目标 有什么分析仪可以在这里提供帮助吗 我认为你可以申请木瓦令牌过滤器 https www ela
  • 嵌套类型的动态映射

    我正在尝试为如下对象创建动态映射 product productId 99999 manufacturerId A0001 manufacturerCode A101LI name Test Product description Desc
  • 按存储桶键值过滤 Elasticsearch 聚合

    我有一个 Elasticsearch 文档索引 其中有一个包含 URL 列表的字段 正如预期的那样 对该字段进行聚合可以计算出唯一 URL 的数量 GET models search query match all size 0 aggs
  • SQL Server 列名区分大小写

    我使用的数据库具有 French CI AS 排序规则 CI 应该代表不区分大小写 但无论如何都是区分大小写的 我试图理解为什么 我断言这一点的原因是 使用 GIVEN 案例设置进行批量插入失败 但使用另一个 Given 案例设置则成功 例
  • Elastic Search 6 嵌套查询聚合

    我是弹性搜索查询和聚合的新手 我有一个带有以下映射的嵌套文档 PUT company mappings data properties deptId type keyword deptName type keyword employee t
  • 使用正则表达式、kibana 搜索数组中的元素

    我正在搜索包含数组字段的记录payload params 我想显示包含该字符串的所有字段aabb 例子 payload params 3raabb 44aabb66 grgeg 展示 3raabb 44aabb66 如何在数组上使用正则表达

随机推荐

  • [innerHTML] 内的 Angular routerLink

    我一直在寻找一种方法 使标准 a href 链接在动态加载到 innerHTML 中时能够像 routerLinks 一样工作 它似乎不是标准的东西 我找不到任何可以满足我需要的东西 我有一个可行的解决方案 但想知道是否有人知道更好的方法来
  • 定义 XML 架构 (XSD) 时“选择”“组”元素是否有效

    定义 XML 架构 XSD 时 选择 组 元素是否有效 即以下有效
  • Google Hangouts API:我可以发起“直播”环聊吗?

    有没有办法通过 API 发起 直播 环聊 我已经创建了我的应用程序并且运行良好 但是我需要为我的客户提供环聊的嵌入代码 我似乎找不到任何有关如何通过环聊按钮启动此类环聊的文档 https developers google com hang
  • 如何快速获取本周星期一的日期

    我正在尝试获取本周星期一的日期 在我的表格视图中 这被视为一周的第一天 我还需要获取本周的星期日 在我的表视图中 这被视为一周的最后一天 目前的尝试 let date NSDate let calendar NSCalendar curre
  • 当找到预期结果时是否可以从 lambda 中中断

    我是Python新手 刚刚对Lambda表达式非常感兴趣 我遇到的问题是使用 lambda 过滤器从元素列表中找到一个且仅有一个目标元素 理论上 当找到目标元素时 就没有再继续下去的意义了 With for loop这很简单break循环
  • jQuery Jcrop setSelect 直观显示,但是点击移动时会跳转

    我正在使用 jQuery 插件 Jcrop 我对名为 setSelect 的初始设置之一有疑问 该属性接受一个包含两组 x 和 y 坐标 左上角和右下角 的数组 img src blah
  • 如何让输出显示在 Visual Studio 2005 错误列表的“消息”窗格中?

    我有一个像这样的头文件 ifndef GEN NOTE MARKERS TO DEVELOPERS HPP define GEN NOTE MARKERS TO DEVELOPERS HPP ifdef DEBUG macros for t
  • 如何在 DRF 中序列化通用外键

    我有带有通用外键的模型 我想序列化该模型 model py class AddressType models Model content type models ForeignKey ContentType object id models
  • 使用调试器 gdb 时未知的结束信号

    我已经在 Mac OS X 上安装了 GDB 为了测试它是否有效 我使用了以下 C 程序 include
  • 为所有实体设置默认分配大小?

    我想将默认设置为 50 的默认 AllocationSize 设置为另一个值 有没有办法做到这一点 我更喜欢使用默认的 JPA 来执行此操作 但 Eclipselink 也可以 我不想在我使用的每个实体中指定分配大小 TableGenera
  • 如何使用 AntiXss 库正确清理内容?

    我有一个简单的论坛应用程序 当有人发布任何内容时 我会 post Content Sanitizer GetSafeHtml post Content 现在 我不确定我是否做错了什么 或者发生了什么 但它不允许几乎没有 html 甚至简单
  • System.Data.SqlClient.SqlException:“关键字“Table”附近的语法不正确。”

    我正在尝试使用 Windows 窗体 C 创建一个登录系统 但它给了我一个错误 我正在使用 MySQL 数据库和来自 youtube 的教程 我不知道出了什么错误 该项目包含三个表单 登录表单 注册表单和主程序表单 using System
  • 设置带有条件的标题属性并使用角度翻译

    我在某些条件下使用标题属性 我的代码是 li title span pack details span li 当管理员为真时 它会显示购买许可证包 但是如何使用翻译过滤器将 1 变为 i18n 键 我试过这个 li title span p
  • 无法使用 Azure DevOps Pull 请求对构建错误进行排队

    我想在拉取请求开始合并之前触发构建 在 Azure DevOps 中 对于此选项 我在分支策略下添加了构建验证 但是 如果我创建了一个新的拉取请求 我会收到 无法对构建进行排队 的消息 请任何人告诉我我选择的选项解决了我的要求 如果是 如何
  • 使用node js从ftp站点下载多个文件

    我正在尝试从根文件夹下载 ftp 服务器上的每个文件 我所做的是这样的 ftpClient ls function err res res forEach function file console log file name ftpCli
  • matplotlib 刻度厚度

    有没有一种方法可以增加 matplotlib 中刻度的厚度和大小 而不必编写如下长段代码 for line in ax1 yaxis get ticklines line set markersize 25 line set markere
  • 如何将公式转换为析取范式?

    说给定一个公式 t1 gt 2 或 t2 gt 3 且 t3 gt 1 我希望得到它的析取范式 t1 gt 2 且 t3 gt 1 或 t2 gt 3 且 t3 gt 1 在Z3中如何实现这一点 Z3没有将公式转换为DNF的API或策略 然
  • 使用 python 访问 HDInsight Hive

    我们有一个 HDInsight 集群 其中包含 HIVE 中的一些表 我想从客户端计算机 Azure 外部 的 Python 3 6 查询这些表 我尝试过使用PyHive pyhs2并且impyla但我遇到了所有这些问题 有没有人有一个访问
  • C 在结构体中初始化数组

    我想要在结构中包含一个可变长度数组 但在正确初始化它时遇到问题 struct Grid int rows int cols int grid int main struct Grid testgrid 1 3 4 5 6 我尝试的所有操作都
  • Elasticsearch 6.2 中的精确匹配、不区分大小写的匹配,无需标准化

    我查看了我能找到的关于执行完全匹配 不区分大小写的查询的每一篇文章和帖子 但在实现后 它们并没有执行我正在寻找的内容 在将此问题标记为重复之前 请阅读整篇文章 给定一个用户名 我想查询我的 Elasticsearch 数据库以仅返回与用户名