【问题标题】:Elasticsearch Filtering woes, uppercase vs lowercase field filteringElasticsearch过滤问题,大写与小写字段过滤
【发布时间】:2021-08-23 09:15:28
【问题描述】:

我的索引中有一个名为“状态”的关键字类型字段。

当我尝试使用 {"term": {"status": "Publish"}} 进行过滤时,它没有返回任何命中 当我尝试使用 {"term": {"status": 'publish"}} 进行过滤时,它会返回正确的结果。

如果状态输入为小写,这将是一回事,但它们实际上是大写的。

我的 kibana GET 返回带有“status”的产品:“Publish”。

我还记得使用大写值插入状态。那为什么只能按小写过滤呢?

最大的警告,我知道这样做很可疑,我试图在项目索引创建后添加“状态”映射。这就是我现在为什么会发生这种情况的罪魁祸首。

有谁知道为什么当映射中的实际值是大写时过滤只对小写值起作用?

【问题讨论】:

    标签: elasticsearch kibana


    【解决方案1】:

    如果没有指定分析器,standard analyzer 是默认分析器。因此,Publish 被索引为 publish。

    如果您没有明确定义任何映射,那么您需要将 .keyword 添加到状态字段。这使用关键字分析器而不是标准分析器(注意状态字段后的“.keyword”)。

    term query 不会对搜索词应用任何分析器,因此只会在倒排索引中查找确切的词。因此,要搜索确切的术语,您需要使用 status.keyword 或更改字段的映射。

    {
      "query": {
        "term": {
          "status.keyword": "Publish"
        }
      }
    }
    

    【讨论】:

    • 我刚刚在 Kibana 中再次查询我的映射。它没有作为关键字的状态,而是将其作为类型文本。一定是一些混乱的事情,如果你有一个现有的索引并尝试向它添加映射,它就会混乱。我相信,由于它是“文本”类型,它会自动将其转换为小写。
    • @VincentTomie 你能分享一下status 字段的索引映射吗?
    • "status" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } },跨度>
    • @VincentTomie 根据您的索引映射,答案中给出的搜索查询将为您提供正确的结果
    猜你喜欢
    • 2014-09-08
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多