【问题标题】:Elasticsearch 6.2: terms query require lowercase input when searching on keywordElasticsearch 6.2:在搜索关键字时,术语查询需要小写输入
【发布时间】:2018-04-11 06:00:38
【问题描述】:

我创建了一个示例索引,具有以下映射:

{
    "_doc": {
        "_source": {
            "enabled": False
        },
        "properties": {
            "status": { "type": "keyword" }
        }
    }
}

并索引了一个文档:

{"status": "CMP"}

使用术语查询搜索具有此状态的文档时,我找不到任何结果:

{
    "query" : {
        "terms": { "status": ["CMP"]}
    }
}

但是,如果我通过将输入输入为小写来进行相同的查询,我会找到我的文档:

{
    "query" : {
        "terms": { "status": ["cmp"]}
    }
}

为什么会这样?由于我正在搜索关键字字段,因此不应分析索引内容并且应匹配大写值...

【问题讨论】:

  • 我无法针对干净的 ES 6.2 实例重现此问题。

标签: elasticsearch elasticsearch-6


【解决方案1】:

现在不再使用@Oliver Charlesworth - 在 Elastic 6.x 中 - 您可以继续使用 keyword datatype,将您的文本小写为 normalizer,doc here。但是,在每种情况下,您都应该更改索引映射并重新索引您的文档

【讨论】:

  • 根据文档,规范化程序应默认为 null...我的关键字怎么可能是小写的?
  • 是的,默认是不开启的……不知道为什么,你应该在索引之前检查你的数据是如何写入的,以及你是如何在ES中摄取数据的
【解决方案2】:

索引和映射创建以及搜索是测试套件的一部分。似乎测试套件的设置部分没有执行,并且映射没有应用于索引。

然后索引使用默认类型而不是映射类型,导致使用字符串字段而不是关键字。

更改自动化测试的设置方法后,映射很好地应用于索引,状态“CMP”的大写值现在匹配文档。

【讨论】:

    【解决方案3】:

    除非出现其他问题,否则不应出现您所看到的症状。

    未分析keyword 索引,因此您的索引应仅包含CMPterms 查询也不会被分析等,因此您的索引仅搜索CMP。因此应该有一个匹配。

    【讨论】:

    • 感谢 Olivier 的回答,但情况恰恰相反;我仅在搜索词为“cmp”而我的索引仅包含“CMP”时才找到结果...
    • @Heschoon - 嗯,是的,我看错了。我会在考虑这个时删除答案!
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多