
要实现不区分大小写的精确匹配,您需要定义自己的分析器。分析仪需要执行两个 *** 作:
- 小写输入值。(不区分大小写)
- 小写 *** 作后对输入的任何修改为“否”。(用于精确搜索)
以上两个可以通过以下方式实现:
lowercase
定义自定义分析器时使用过滤器。- 将设置
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并因此导致匹配。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)