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

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

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

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

  1. 小写输入值。(不区分大小写)
  2. 小写 *** 作后对输入的任何修改为“否”。(用于精确搜索)

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

  1. lowercase
    定义自定义分析器时使用过滤器。
  2. 将设置
    tokenizer
    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
现场应用。

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

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
上面的查询中
username
UsErNaMe
USERname
全部将匹配文档。原因是,在搜索中是否未明确指定分析器时,elasticsearch在建立索引时会使用应用于该字段的分析器。在上述情况下,当对field进行搜索时
username
case_insensitive_analyzer
将应用于输入值
USERNAME
,即将导致标记
username
并因此导致匹配。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4911725.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存