【问题标题】:Keyword tokenizer vs not_analyzed关键字标记器与 not_analyzed
【发布时间】:2017-04-12 16:16:34
【问题描述】:

当使用 term 指定过滤器时,该字段应该始终是 not_analyzed 还是可以使用 keyword 分析器?例如:

        "must_not": [
          {
            "term": {
              "personid": "ABADF00D-BEEF-4218-B59B-A164017A3BA0"
            }
          },

如果我想查找不区分大小写的 personid,我可能会使用带有小写过滤器的关键字标记器。但这似乎导致它在用作术语时不起作用。在这种情况下我应该坚持 not_analyzed 吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    将字段声明为 not_analyzed 相当于使用 keyword 标记器而不使用任何其他过滤器(即没有 lowercase)。

    如果您希望能够以不区分大小写的方式搜索该字段,但仍允许term 查询,您有两种选择。

    选项 A:像现在一样使用 keyword 标记器 + lowercase 标记过滤器,但请确保将 term 查询中的值小写,即

        "must_not": [
          {
            "term": {
              "personid": "abadf00d-beef-4218-b59b-a164017a3ba0"
            }
          },
    

    选项 B:像现在一样使用 keyword 标记器 + lowercase 标记过滤器(下面命名为 your_analyzer),但还要添加一个子字段 raw,您将其声明为 not_analyzed。所以你的映射基本上看起来像这样:

    {
      "personid": {
        "type": "string",
        "analyzer": "your_analyzer",
        "fields": {
          "raw": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
    

    然后您将在 personid.raw 子字段上运行 term 查询,如果您想不区分大小写地进行搜索,那么您将在 personid 字段上运行查询

        "must_not": [
          {
            "term": {
              "personid.raw": "ABADF00D-BEEF-4218-B59B-A164017A3BA0"
            }
          },
    

    【讨论】:

    • 如果在过滤器中(而不是在查询中)使用该术语会有所不同吗?
    • 自 ES 2.x 以来查询和过滤器之间不再有区别
    • 哦,我们还在 1.7 中,很快就会升级到受支持的版本。
    • 然后确实在过滤器中使用term
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多