问题:
使用Elasticsearch 5.6.8版,我想搜索确切的电子邮件地址。
我有两个同时在6.1.0和5.6.8版本上运行的ES服务器。我可以在6.1.0版中轻松搜索电子邮件(请参见下面的代码),但在5.6.8版中则无法使用。
由于我的登台服务器和生产服务器都在5.6.8版本上运行,因此我需要使其在5.6.8版本上可用。
顺便说一句,当我说它不起作用时..这意味着它不返回任何结果或结果是错误的。
试用版:适用于6.1.0,但不适用于5.6.8
试图将email
的类型从text
更改为keyword
,但还是没有运气。
"email": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
下面是我的索引,映射,查询等的详细信息。
创建用户索引
PUT http://localhost:9200/acme_users
{
"settings": {
"analysis": {
"normalizer": {
"custom_sort_normalizer": {
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"]
}
}
}
}
}
为用户设置映射
PUT http://localhost:9200/acme_users/_mapping/user
{
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
},
"company": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
},
"role": {
"properties": {
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
}
}
},
"groups": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
}
}
},
"groupsKeyword": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
},
"email": {
"type": "keyword",
"ignore_above": 256,
"normalizer": "custom_sort_normalizer"
}
}
}
查询
GET http://localhost:9200/acme_users/user/_search
{
"from" : 0,
"size" : 15,
"query" : {
"bool" : {
"must" : [
{
"query_string" : {
"query" : "activedInd: true AND deletedInd: false",
"fields" : [ ],
"use_dis_max" : true,
"tie_breaker" : 0.0,
"default_operator" : "or",
"auto_generate_phrase_queries" : false,
"max_determinized_states" : 10000,
"enable_position_increments" : true,
"fuzziness" : "AUTO",
"fuzzy_prefix_length" : 0,
"fuzzy_max_expansions" : 50,
"phrase_slop" : 0,
"escape" : false,
"split_on_whitespace" : true,
"boost" : 1.0
}
},
{
"query_string" : {
"query" : "bungoton.si.bryan@gmail.com*",
"fields" : [ ],
"use_dis_max" : true,
"tie_breaker" : 0.0,
"default_operator" : "or",
"auto_generate_phrase_queries" : false,
"max_determinized_states" : 10000,
"enable_position_increments" : true,
"fuzziness" : "AUTO",
"fuzzy_prefix_length" : 0,
"fuzzy_max_expansions" : 50,
"phrase_slop" : 0,
"escape" : false,
"split_on_whitespace" : true,
"boost" : 1.0
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
"sort" : [
{
"name.keyword" : {
"order" : "asc"
}
}
]
}
如果我在查询值中使用*
,则它不会在5.6.8
上返回任何内容,但是会在6.1.0
上返回准确的记录。
"query" : "bungoton.si.bryan@gmail.com*"
在5.6.8
上,如果我删除*
,它将返回结果,但是将返回所有电子邮件中包含gmail.com
的帐户。在Windows端完成效果相同。
我不知道我在想什么。它只是在5.6.8
上不返回任何内容。
顺便说一下,查询部分是从我的Java应用程序(ES高级Java客户端)生成的。