我看过每一篇文章,发现可以执行精确匹配,不区分大小写的查询,但是在实现时,它们并不能满足我的要求。
在将此问题标记为重复之前,请阅读整篇文章。
给定一个用户名,我想查询我的Elasticsearch数据库以仅返回一个与该用户名完全匹配但不区分大小写的文档。
我尝试lowercase
为username
属性指定分析器,并使用match
查询来实现此行为。虽然这解决了区分大小写的匹配问题,但在精确匹配时失败了。
我考虑使用lowercase
规范化程序,但这会使索引中的所有用户名都变为小写,因此当我聚合用户名时,它们将以小写形式返回,这不是我想要的。我需要在用户名中保留每个字母的原始大小写。
POST {elastic}/users/_doc
{
"email": "random@email.com",
"username": "UsErNaMe",
"password": "1234567"
}
该文档将存储在users
准确地称为索引的索引中。
GET {frontend}/user/UsErNaMe
应该回来
{
"email": "random@email.com",
"username": "UsErNaMe",
"password": "1234567"
}
和
GET {frontend}/user/username
应该回来
{
"email": "random@email.com",
"username": "UsErNaMe",
"password": "1234567"
}
和
GET {frontend}/user/USERNAME
应该回来
{
"email": "random@email.com",
"username": "UsErNaMe",
"password": "1234567"
}
和
GET {frontend}/user/UsErNaMe $RaNdoM LeTteRs
应该 不 返回任何东西。
谢谢。
要实现不区分大小写的精确匹配,您需要定义自己的分析器。分析仪需要执行两个操作:
以上两个可以通过以下方式实现:
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
并因此导致匹配。
我试图在Elasticseach 7中实现部分的、区分大小写的匹配。 我正在使用设置创建索引: 以及映射: 以下查询将正确返回文档: 但当我将搜索词小写时,它不会返回文档: 如何配置Elasticsearch,使其与使用小写搜索词的名称字段值匹配?
如何在Java中以区分大小写的方式进行匹配?我的意思是,我想编写一个类似的regex。但是我想匹配以及等等。在Java中最简单的方法是什么?
问题内容: 我想知道是否有一种方法可以在java switch case语句中执行不区分大小写的匹配。默认实现 区分大小写 。请参见下面的示例。 因此,以上语句作为输出返回。而且我正在尝试使其像 不区分大小写的 匹配一样工作。我尝试将字符串文字都转换为小写,然后进行比较。但无法做到。 问题答案: 如果要这样做:只需确保输入数据全部为小写,并使用小写… 本地化问题 同样,古老的本地化问题再次引起人们
我从这里学了一个例子 索引的映射为 索引的文档是 在对“full_text”字段使用简单的匹配查询时,我注意到如下所示 我看到文件是匹配的。另外,如果我使用大写字母,也就是“quick”作为搜索词,它显示文档是匹配的。 为什么会这样?。默认情况下,标记器会将“full_text”字段中的文本拆分为“quick”、“foxes”。那么,匹配查询如何与文档匹配大小写值呢?
使用XPath,我想“匹配整个单词”(用户选项,就像VS搜索一样)。 似乎函数
问题内容: 我对使用ngram的单词有部分匹配。如何修改映射以始终偏爱精确匹配而不是ngram令牌?我不想修改查询。一个搜索框将搜索多种类型,每种类型都有各自的字段。 例如,假设我正在搜索职位,一个人的标题为“现场工程师”,另一个人的标题为“引擎技术员”。如果用户搜索“引擎”,我希望ES将后者返回为更相关。 我几乎逐字使用此映射:例外:我使用的ngram的最小值为3,最大值为11,而不是边缘ngr