要实现不区分大小写的精确匹配,您需要定义自己的分析器。分析仪需要执行两个操作:
以上两个可以通过以下方式实现:
现在,可以将此自定义分析器应用于需要区分大小写的精确搜索的文本字段。
因此,要创建索引,您可以在下面使用:
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
并因此导致匹配。