Elasticsearch 搜索没有结果,分析器可能是问题所在
Elasticsearch search yields no results, analyzers might be the issue
Elasticsearch 版本:1.6.0
过去几个月我一直在使用 elasticsearch(刚刚开始),现在我 运行 遇到了问题。这是关于我的数据库的一些信息:
我使用的索引使用默认的动态映射(例如:我没有修改它的映射)。我的对象应该是无模式的。此外,索引使用默认分析器(我也没有触及)所以 index/_settings
看起来像这样:
{
"default": {
"settings": {
"index": {
"creation_date": "1441808338958",
"uuid": "34Yn1_ixSqOzp9UotOE_4g",
"number_of_replicas": "1",
"number_of_shards": "1",
"version": {
"created": "1060099"
}
}
}
}
}
这是我遇到的问题:在某些字段值上,搜索没有按预期工作(我断定这是因为分析器)。示例:字段 email
的值为 user@example.com
; {"query":{"bool":{"must":[{"term":{"user.email":"user@example.com"}}]}}
将不起作用,但将术语值设为 "user" 会起作用(因为它以某种方式对其进行了标记,并且没有包含完整电子邮件地址的标记)。
这就是我想要的:我想要 通配符 文本搜索(在评论文本中查找错误词)和 strict 在任何字段上搜索(例如在电子邮件中),然后我将使用 bool
和 should
以及 term
或 wildcard
.
问题是我不能告诉他 "ok, on this field you should use the X analyzer" 因为我所有的字段都是动态的。
我试过的:在索引的设置上,我 PUT-ed 这个:{"analysis":{"analyzer":{"default":{"type":"keyword"}}}}
;不起作用:没有任何改变(我也没有忘记在关闭索引之前关闭索引并打开它)。
这个问题是否与分析器有关?
此查询无效
{"query":{"bool":{"must":[{"term":{"user.email":"user@example.com"}}]}}
术语完全匹配,这意味着无论您对该字段的值是什么(user@example.com" 在您的情况下)都必须匹配任何 标记 ES 有那个字段。
当您没有为该字段分配任何分析器时,ES 将假设您正在为该字段使用标准分析器。当这个 "user@example.com" 被索引时,它将被标记为 ("user","example","com")。
要解决您的问题,您必须告诉 ES "not_analyzed" 索引映射中的电子邮件字段。
在 Ryan Huynh 的帮助下,我解决了我的问题:
使用动态映射;像这样创建索引:
PUT /index
{
"mappings": {
"_default_": {
"dynamic_templates": [
{
"string_template": {
"mapping": {
"index": "not_analyzed",
"type": "string"
},
"match_mapping_type": "string",
"match": "*"
}
}
]
}
}
Elasticsearch 版本:1.6.0
过去几个月我一直在使用 elasticsearch(刚刚开始),现在我 运行 遇到了问题。这是关于我的数据库的一些信息:
我使用的索引使用默认的动态映射(例如:我没有修改它的映射)。我的对象应该是无模式的。此外,索引使用默认分析器(我也没有触及)所以 index/_settings
看起来像这样:
{
"default": {
"settings": {
"index": {
"creation_date": "1441808338958",
"uuid": "34Yn1_ixSqOzp9UotOE_4g",
"number_of_replicas": "1",
"number_of_shards": "1",
"version": {
"created": "1060099"
}
}
}
}
}
这是我遇到的问题:在某些字段值上,搜索没有按预期工作(我断定这是因为分析器)。示例:字段 email
的值为 user@example.com
; {"query":{"bool":{"must":[{"term":{"user.email":"user@example.com"}}]}}
将不起作用,但将术语值设为 "user" 会起作用(因为它以某种方式对其进行了标记,并且没有包含完整电子邮件地址的标记)。
这就是我想要的:我想要 通配符 文本搜索(在评论文本中查找错误词)和 strict 在任何字段上搜索(例如在电子邮件中),然后我将使用 bool
和 should
以及 term
或 wildcard
.
问题是我不能告诉他 "ok, on this field you should use the X analyzer" 因为我所有的字段都是动态的。
我试过的:在索引的设置上,我 PUT-ed 这个:{"analysis":{"analyzer":{"default":{"type":"keyword"}}}}
;不起作用:没有任何改变(我也没有忘记在关闭索引之前关闭索引并打开它)。
这个问题是否与分析器有关?
此查询无效
{"query":{"bool":{"must":[{"term":{"user.email":"user@example.com"}}]}}
术语完全匹配,这意味着无论您对该字段的值是什么(user@example.com" 在您的情况下)都必须匹配任何 标记 ES 有那个字段。
当您没有为该字段分配任何分析器时,ES 将假设您正在为该字段使用标准分析器。当这个 "user@example.com" 被索引时,它将被标记为 ("user","example","com")。
要解决您的问题,您必须告诉 ES "not_analyzed" 索引映射中的电子邮件字段。
在 Ryan Huynh 的帮助下,我解决了我的问题:
使用动态映射;像这样创建索引:
PUT /index
{
"mappings": {
"_default_": {
"dynamic_templates": [
{
"string_template": {
"mapping": {
"index": "not_analyzed",
"type": "string"
},
"match_mapping_type": "string",
"match": "*"
}
}
]
}
}