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 在任何字段上搜索(例如在电子邮件中),然后我将使用 boolshould 以及 termwildcard .

问题是我不能告诉他 "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": "*"
          }
        }
      ]
    }
}