您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

完全匹配,不区分大小写的匹配,无需在Elasticsearch 6.2中进行标准化

完全匹配,不区分大小写的匹配,无需在Elasticsearch 6.2中进行标准化

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

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

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

因此,要创建索引,您可以在下面使用:

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现场应用。

因此,当您为文档编制索引时,如下所示:

PUT test/_doc/1
{
  "email": "random@email.com",
  "username": "UsErNaMe",
  "password": "1234567"
}

对于该字段username,输入为UsErNaMe。分析仪首先lowercase对输入UsErNaMe值应用过滤器,以得出值username。现在,在此值username上应用keyword令牌化器,该令牌化器什么也不做,只是将应用过滤器后获得的值作为单个令牌输出username

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

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

使用上面的将为您提供所需的输出。更换USERNAME上面的查询usernameUsErNaMeUSERname全部将匹配文档。原因是,在搜索中是否未明确指定分析器时,elasticsearch在建立索引时会使用应用于该字段的分析器。在上述情况下,当对field进行搜索usernamecase_insensitive_analyzer将应用于输入值USERNAME,即将导致标记username并因此导致匹配。

其他 2022/1/1 18:21:53 有568人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶