在elasticsearch中更新文档时,没有将自定义分析器应用于字段数据

bwleehnv  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(313)

我有一个字段,上面有一个自定义的分析器,可以将数据转换成小写。
分析仪定义为:

"analysis" : {
      "analyzer" : {
        "custom_keyword_analyzer" : {
          "filter" : [
            "lowercase"
          ],
          "type" : "custom",
          "tokenizer" : "keyword"
        }
      }
    }

场上的Map如下:

"Field" : {
        "type" : "text",
        "fields" : {
          "raw" : {
            "type" : "keyword"
          }
        },
        "copy_to" : [
          "all_field"
        ],
        "analyzer" : "custom_keyword_analyzer",
        "fielddata" : true
      }

当使用字段中的数据正常创建文档时,分析器工作正常。field包含小写数据,field.raw包含原始的未分析数据。
但是,如果文档是在字段中没有任何内容的情况下创建的,但随后进行了更新,则不会使用分析器,字段中包含未分析的数据,field.raw为空。
我尝试过用python手动编写批量更新的脚本,还使用了\u update \u by \u query来执行更新。在任何情况下,我都不能让分析仪处理更新后的数据。

roejwanj

roejwanj1#

我不知道你是如何验证你的更新文件没有分析仪的影响,下面是一个完整的例子来告诉你,它的工作原理和你可以如何检查它。
根据定义进行索引Map

{
    "settings": {
        "analysis": {
            "analyzer": {
                "custom_keyword_analyzer": {
                    "filter": [
                        "lowercase"
                    ],
                    "type": "custom",
                    "tokenizer": "keyword"
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "fields": {
                    "raw": {
                        "type": "keyword"
                    }
                },
                "copy_to": [
                    "all_field"
                ],
                "analyzer": "custom_keyword_analyzer",
                "fielddata": true
            }
        }
    }
}

索引示例文档

{
   "title" : "Hello world"
}

检查倒排索引中的分析值
使用 _search 具有以下查询的终结点

{
  "docvalue_fields": [
    "title",
    "title.raw"
  ],
  "query": {
        "term": {
            "_id": 1
        }
    }
}

以上查询结果

"_source": {
                    "title": "Hello world" // actual indexed content 
                },
                "fields": {
                    "title.raw": [
                        "Hello world" // same as keyword analyzer
                    ],
                    "title": [
                        "hello world" // notice lowercased `h`.
                    ]
                }
            }

现在使用putapi更新doc

{
   "title" : "Hello world Updated" // note `U` in `Updated`
}

再次使用相同的 _search 查询

"_source": {
                    "title": "Hello world Updated"
                },
                "fields": {
                    "title.raw": [
                        "Hello world Updated"
                    ],
                    "title": [
                        "hello world updated" // note lowercase
                    ]
                }

正如您所看到的,即使在更新了DocumentAnalyzer impact之后,它的工作方式和可验证性仍然存在,它是非常核心的功能,不能被破坏,并且可能您在验证时遗漏了一些内容,而上述方法应该为您提供一些识别错误的方法

相关问题