关键字标记器与not_analyzed

时间:2017-04-12 16:16:34

标签: elasticsearch

使用 term 指定过滤器时,字段是 not_analyzed 还是关键字分析器?例如:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

选项A:像现在一样使用keyword令牌化程序+ lowercase令牌过滤器,但请务必将term查询中的值小写,即

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

选项B:现在使用keyword令牌化程序+ lowercase令牌过滤器(在下面命名为your_analyzer),同时添加您声明的子域rawnot_analyzed。所以你的映射基本上是这样的:

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

然后您在term子字段上运行personid.raw查询,如果您想要不区分大小写搜索,那么您就可以在{{1}上运行查询字段

personid